我想做的是给出如下列表的列表:
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.
事实上,
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.