比较列表列表

问题描述 投票:0回答:1

我想做的是给出如下列表的列表:

inicialState(e([5, 5, 5], [6, 5, 5])).

我想计算一个列表中所有元素的一些并将其与某个值进行比较,为此我想分析上面的列表列表并分别分析每个列表并进行计算,例如我想看看是否第一个列表中的 5+5+5 等于“N”并打印“True”或“False”,然后分析第二个列表并查看 6+5+5 是否等于“N”并打印相同的结果事物。 问题是我的功能只在控制台中打印“否”。

add([], 0).
add([H|T], Sum) :- add(T, Rest), Sum is H + Rest.

equal(_, []). 
equal(Target, [H|T]) :- add(H, Sum), write(Sum), (Target =:= Sum -> write('True') ; write('False')), equal(Target, T).

我调用以下函数:

testLists(Size) :-
    N is (Size + (Size*(Size*Size))) / 2,
    write(N),
    nl,
    inicialState(List),
    equal(N, List).

我尝试执行以下功能:

equal2(Target, Sum) :- nl, Target =:= Sum -> write('True') ; write('False').

这个函数的问题是它可以工作,但只适用于一个列表,而不是列表列表,我必须调用一个单独的函数来添加列表中的每个元素,如下所示:

add([], 0).
add([H|T], Sum) :- add(T, Rest), Sum is H + Rest.
prolog constraints
1个回答
0
投票

事实上,

e([5,5,5], [6,5,5])
不是列表的列表,而是一个函子为
e
、参数为列表的项。这是您的代码的主要问题。要解决这个问题,你应该写
[[5,5,5], [6,5,5]]
。我建议对您的代码进行以下修改:

initial_state([[5, 5, 5], [6, 5, 5], [4, 5, 6]]).

test_lists(Size) :-
    N is (Size + Size ^ 3) / 2, % use the exponentiation operator
    write(target = N),
    nl,
    initial_state(List),
    equal(List, N).

% By reversing the order of the arguments of equal/2, the spurious
% backtracking point is eliminated (avoiding the answer false).

equal([], _).
equal([L|Ls], Target) :-
    sum(L, Sum),
    write(Sum),
    (  Target =:= Sum
    -> write(' => True')
    ;  write(' => False') ),
    nl,
    equal(Ls, Target).

% Using an accumulator, the recursive process for computing the sum is
% transformed into an iterative one (tail-call optimization). 

sum(List, Sum) :-
    sum(List, 0, Sum).

sum([], Acc, Acc).
sum([First|Rest], Acc, Sum) :-
    Acc1 is Acc + First,
    sum(Rest, Acc1, Sum).

示例:

?- test_lists(3).
target=15
15 => True
16 => False
15 => True
true.
© www.soinside.com 2019 - 2024. All rights reserved.