Prolog递归地将函数应用于列表

Prolog递归地将函数应用于列表,prolog,Prolog,我有一个列表,我想从所有列表中删除重复的列表 我已经有了从列表中删除重复项的代码 我唯一需要做的就是将其应用于整个列表,并通过第二个参数返回它 这就是我试过的 rem_list_dup([], _). rem_list_dup([H | T], Final) :- remove_duplicates(H, List), /* This already works. Removes all duplicates from list H. List is the resulting list

我有一个列表,我想从所有列表中删除重复的列表

我已经有了从列表中删除重复项的代码

我唯一需要做的就是将其应用于整个列表,并通过第二个参数返回它

这就是我试过的

rem_list_dup([], _).
rem_list_dup([H | T], Final) :-
    remove_duplicates(H, List), /* This already works. Removes all duplicates from list H. List is the resulting list */
    rem_list_dup(T, [List | Final]).
编辑:

输入示例:

[[a,b,a],[b,b,c],[c,c,c]]

输出:

[[a,b],[b,c],[c]]


顺序并不重要。

既然您了解了使用递归和基本情况的基本知识,并且知道如何使用跟踪程序,那么您应该能够快速理解此处的一些更改,而不需要了解原因

remove_duplicates(List,Set) :-
    list_to_set(List,Set).

rem_list_dup([],[]).
rem_list_dup([H0|T0],[H|T]) :-
    remove_duplicates(H0,H),
    rem_list_dup(T0,T).

:- begin_tests(rem_list_dup).

rem_list_dup_test_case_generator([[a, b, a], [b, b, c], [c, c, c]],[[a, b], [b,c], [c]]).

test(1,[forall(rem_list_dup_test_case_generator(List0,List))]) :-
    rem_list_dup(List0,List).

% Based on comment by @false
test(2,[forall(rem_list_dup_test_case_generator(List0,List))]) :-
    maplist(list_to_set,List0,List).

:- end_tests(rem_list_dup).
使用SWI-Prolog运行的示例

?- consult("C:/Users/Groot/Documents/Projects/Prolog/SO_question_182.pl").
true.

?- run_tests.
% PL-Unit: rem_list_dup .. done
% All 2 tests passed
true.

第一个参数是一个列表
[H | T]
,而
H
是它的头。在跟踪它之后,我注意到基本情况是完全错误的。但我不知道该写什么。与其他语言相比,这是我在Prolog中看到的困难。递归很好,但它需要实际的模式匹配到基本情况。我通常会做
rem\u list\u dup([],[])。
因为我希望
Final
最终成为
[]
,但它不再匹配模式。哎呀,你刚刚删除了。请注意,如果您删除您的问题,人们将避免回答您的问题。这就像是在一只书写的手下撕下一张纸。我删除了它,因为它因为不够清晰而被标记为一个糟糕的问题。我是新来的,所以我假设这样标记的问题会从问题列表中消失。对不起,它完全按照我的预期工作。谢谢你,很好地解决了这个问题@没问题。只写了几年递归谓词。
rem\u list\u dup(Ts,Us):-maplist(remove\u duplicates,Ts,Us)。
@false当你看到关于
yfy
的问题时,记住今天是4月1日,所以不要破坏它。祝你好运!然而,我确实记得这样一个问题是认真的。我将在4月2日展示它。