2017-05-31 79 views
1

我在大学考试时使用Prolog语言进行考试,我不知道如何创建函数:在列表中检查唯一值。我的意思是,如果列表中的每个值都是唯一函数,则返回true,否则返回false。例如。列表中的Prolog唯一值

[1,2,3,5] - true 
[1,2,2,4] - false 

该函数的标题是uniqueValues(X)X - 均值列表。我真的不知道这种语言,如果有人能解释我如何创建这个功能将是伟大的。谢谢你的帮助

+0

对不起我的坏,改变。 –

+0

检查这个帖子出来:https://stackoverflow.com/questions/2426484/how-to-find-differences-in-lists-in-prolog-and-determine-if-the-lists-are-the-sa –

回答

4

不知道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). 
  1. 空列表是唯一的。
  2. 列表不为空([X |两个X])是,如果唯一的:
    1. 两个X不包含X,和
    2. 两个X也是唯一
+0

非常感谢你的解释 –

+0

'\ + memberchk(X,XS)' - >'\ +会员(X,XS)' –

+1

@PauloMoura为什么我会喜欢成员在这种情况下? –