Prolog列表中的唯一值
我在大学学习Prolog语言准备考试,但我不知道如何创建函数:检查列表中的唯一值。我的意思是,若列表中的每个值都是唯一的,那个么函数返回true,否则返回false。例如Prolog列表中的唯一值,prolog,Prolog,我在大学学习Prolog语言准备考试,但我不知道如何创建函数:检查列表中的唯一值。我的意思是,若列表中的每个值都是唯一的,那个么函数返回true,否则返回false。例如 [1,2,3,5] - true [1,2,2,4] - false 此函数的标题是uniqueValues(X)X-mean列表。我真的不知道这种语言,如果有人能解释我如何创建这个函数将是伟大的。感谢您的帮助不知道序言,这会有点麻烦,但让我们试一试。在Prolog中,函数通过递归而不是迭代工作。对于列表处理,这意味着(通常
[1,2,3,5] - true
[1,2,2,4] - false
此函数的标题是uniqueValues(X)X-mean列表。我真的不知道这种语言,如果有人能解释我如何创建这个函数将是伟大的。感谢您的帮助不知道序言,这会有点麻烦,但让我们试一试。在Prolog中,函数通过递归而不是迭代工作。对于列表处理,这意味着(通常)您必须决定如何处理空列表以及如何处理其他列表前面的元素。因此,首先,您需要对空列表做出决定
unique([]).
这表示“空列表是唯一的”。这是一个有用的属性
递归案例假设您已经知道如何处理列表的其余部分。在像这样的“普通”递归列表处理谓词中,您往往具有这种结构:
foo([X|Xs]) :- /* do something with X */, foo(Xs).
那里的foo(Xs)
说,“在剩下的任何地方运行相同的东西。”所以我们必须问的问题是,我们如何知道以X开头并以Xs结尾的列表是否唯一?好吧,我们可以确保X是唯一的,确保它不会出现在列表中的其他地方。像这样:
unique([X|Xs]) :- \+ memberchk(X, Xs).
考虑您的示例[1,2,3,4]
。中的第一次,X=1和Xs=[2,3,4]\+
在Prolog中表示“不”,并且memberchk/2
告诉您列表中是否有内容。因此memberchk(1[2,3,4])
将失败,\+
将把失败转化为成功。这很好!此外,使用[1,2,1]
,X将等于1,Xs将等于[2,1],成员chk/2
将成功,然后被否定为失败。这可能就是我们想要的
将其与递归调用结合起来,可以得到整个谓词的结果:
unique([]).
unique([X|Xs]) :- \+ memberchk(X, Xs), unique(Xs).
抱歉,我的错误,已更改。请查看此帖子:
\+memberchk(X,Xs)
->\+member(X,Xs)
@PauloMoura在这种情况下为什么我更喜欢成员?成功调用\+/1
不会返回绑定,也不允许回溯到其参数中…@PauloMoura我不绑定或回溯此任务。我不知道通过改变它我会买什么。@PauloMoura每当我不需要回溯或统一时,我倾向于使用memberchk/2
,这就是其中之一。我认为这里用哪一个并不重要。但是你比我更有经验,所以如果你知道一个具体的区别,一个我应该使用它的原因,我会的。