PROLOG比较2个列表

时间:2014-05-20 18:20:50

标签: prolog

我已经尝试了很长时间并且搜索了很多(...)但没有。

我想要的是创建一个函数,将一个列表的元素与其他列表的元素进行比较。

事情是我完全不知道我将如何遍历这两个列表的成员。

实施例。将第一列表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并不是我已经习惯的东西..

1 个答案:

答案 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