我有许多包含字母的列表,我编写了一个谓词,用于检查这些给定列表中是否存在重复项:
noDuplicates([]).
noDuplicates([H|T]):-
not(member(H, T)),
noDuplicates(T).
我有10个列表,我想知道其中任何一个是否没有重复,所以我将它们列入一个大列表的子列表,如:
[[A,B,C], [C,A,D], [E,F,G]...]]
(因此大名单中可能存在重复项,但个别子列表中不存在重复项。)
我知道我必须进行10次重复测试;每个子列表一次,但我如何在Prolog中写这个?我可能会把它写下来10次,但我的猜测是我可以使用递归来使prolog重复,直到所有子列表都被检查。
所以基本上:我希望这个谓词重复N次,直到N为10.我真的很挣扎。有谁知道该做什么?
答案 0 :(得分:4)
让我们概括这个问题如下:
您有一个谓词p/1
,表达您对单个列表的所需内容。
因此,要将此定义提升此类列表的列表,您可以按如下方式定义谓词ps/1
:
ps([]). ps([L|Ls]) :- p(L), ps(Ls).
每次看到此模式时,都可以使用maplist/2
。也就是说,上面的等同于:
ps(Ls) :- maplist(p, Ls).
目标maplist(p, Ls)
为{strong> if {/ strong> p
对L
的每个元素Ls
都有效。
请注意,如果您考虑“循环”和“重复”,它将限制您对Prolog的理解。这些是命令性概念,只有在列表已经完全实例化时才有意义。但是,从Prolog开始,我们期望的不止于此:我们期望与该关系所持有的生成列表成为一个完整的关系。在这种情况下,没有什么可以“重复”:我们从零开始,并询问Prolog一般有什么解决方案。
因此,当关系ps/1
对列表列表保持时,请考虑描述:
[]
。[L|Ls]
,如果我们的初始谓词(p/1
)适用于L
,和 {{1保留剩余列表ps/1
。此声明性读取适用于所有方向,无论已经实例化了多少列表元素(如果有)。它适用于10个列表以及零和50。