我在大学考试时使用Prolog语言进行考试,我不知道如何创建函数:在列表中检查唯一值。我的意思是,如果列表中的每个值都是唯一函数,则返回true,否则返回false。例如。列表中的Prolog唯一值
[1,2,3,5] - true
[1,2,2,4] - false
该函数的标题是uniqueValues(X)X - 均值列表。我真的不知道这种语言,如果有人能解释我如何创建这个功能将是伟大的。谢谢你的帮助
我在大学考试时使用Prolog语言进行考试,我不知道如何创建函数:在列表中检查唯一值。我的意思是,如果列表中的每个值都是唯一函数,则返回true,否则返回false。例如。列表中的Prolog唯一值
[1,2,3,5] - true
[1,2,2,4] - false
该函数的标题是uniqueValues(X)X - 均值列表。我真的不知道这种语言,如果有人能解释我如何创建这个功能将是伟大的。谢谢你的帮助
不知道Prolog,这将是一个拖拉,但让我们试试吧。在Prolog中,函数使用递归而不是迭代。对于列表处理来说,这意味着(通常)您必须决定如何处理空列表以及如何处理其他列表前面的元素。首先,您需要对空白列表做出决定。
unique([]).
这说“空列表是唯一的”。这是一个有用的财产。
递归情况假设您已经知道如何处理列表的其余部分。在“普通”递归表处理谓词这样,你往往有这样的结构:
foo([X|Xs]) :- /* do something with X */, foo(Xs).
的foo(Xs)
有说,“和运行任何剩下的同样的事情。”所以我们不得不问的问题是,我们如何知道以X开头并以X结尾的列表是否是唯一的?那么,我们可以确保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],则memberchk/2
会成功,然后被否定成故障。这可能是我们想要的!
把与递归调用时,就成了这对整个谓语:
unique([]).
unique([X|Xs]) :- \+ memberchk(X, Xs), unique(Xs).
非常感谢你的解释 –
'\ + memberchk(X,XS)' - >'\ +会员(X,XS)' –
@PauloMoura为什么我会喜欢成员在这种情况下? –
对不起我的坏,改变。 –
检查这个帖子出来:https://stackoverflow.com/questions/2426484/how-to-find-differences-in-lists-in-prolog-and-determine-if-the-lists-are-the-sa –