我已经尝试了很长时间并且搜索了很多(...)但没有。
我想要的是创建一个函数,将一个列表的元素与其他列表的元素进行比较。
事情是我完全不知道我将如何遍历这两个列表的成员。
实施例。将第一列表L1的第一个成员与L2的成员进行比较。如果它满足某个条件(条件可能会有所不同,但比较/ 4,成员等不会这样做),我会选择L1的第二个成员给L2的所有成员,依此类推。
事情是我不知道如何通过使用[P | R]检查其成员,同时与L1的第一个元素进行比较后,返回“完整列表”L2。之后,我如何比较L1的第二个元素和L2的元素?有什么办法可以“重置”回到第一个位置?
我有类似
的东西function([P|R], [F|L]) :-
P == F,
function([P|R],L)
;
P \== F, (guess not necessary)
function(R, [F|L]).
(它有更多的东西,但这几乎是我想要的基础)
但是在通过1个列表的所有成员后,它表现出奇怪的行为。
是的,这可能是一个非常基本的问题,但Prolog并不是我已经习惯的东西..
答案 0 :(得分:3)
如果你有一个列表,你的元素在某种程度上与另一个列表的所有元素进行比较,然后有一个结果列表,那么你至少需要3个参数。
compare_list([H1|T1], L, R) :-
( check_element(H1, L), % Compare H1 with elements of L somehow
-> R = [H1|T2] % if the criteria succeeds
; R = T2 % if the criteria fails
),
compare_list(T1, L, T2).
compare_list([], _, []).
你提到过你要将第一个列表的元素与第二个列表的元素进行比较,但这可能会有所不同。所以我只是将它称为谓词check_element/2
,它接受第一个列表中的元素和第二个列表中的元素,并以某种方式比较它们。
check_element(X, [H|T]) :-
... % compare X and H somehow; decide how/when to succeed
check_element(X, T).
check_element(_, []).
check_element/2
的行为可能会因您的意愿而异。在达到某些条件后,它可能会在完成列表[H|T]
之后成功,或者在成功之前可能需要某个元素以某种方式与[H|T]
的每个元素进行比较。你的选择。如果是后者,则可以使用check_element/2
形式替换maplist
。