Prolog列表中的唯一值

Prolog列表中的唯一值,prolog,Prolog,我在大学学习Prolog语言准备考试,但我不知道如何创建函数:检查列表中的唯一值。我的意思是,若列表中的每个值都是唯一的,那个么函数返回true,否则返回false。例如 [1,2,3,5] - true [1,2,2,4] - false 此函数的标题是uniqueValues(X)X-mean列表。我真的不知道这种语言,如果有人能解释我如何创建这个函数将是伟大的。感谢您的帮助不知道序言,这会有点麻烦,但让我们试一试。在Prolog中,函数通过递归而不是迭代工作。对于列表处理,这意味着(通常

我在大学学习Prolog语言准备考试,但我不知道如何创建函数:检查列表中的唯一值。我的意思是,若列表中的每个值都是唯一的,那个么函数返回true,否则返回false。例如

[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).
  • 空列表是唯一的
  • 不为空的列表([X | Xs])在以下情况下是唯一的:
  • Xs不包含X,并且
  • Xs也是独一无二的

  • 抱歉,我的错误,已更改。请查看此帖子:
    \+memberchk(X,Xs)
    ->
    \+member(X,Xs)
    @PauloMoura在这种情况下为什么我更喜欢成员?成功调用
    \+/1
    不会返回绑定,也不允许回溯到其参数中…@PauloMoura我不绑定或回溯此任务。我不知道通过改变它我会买什么。@PauloMoura每当我不需要回溯或统一时,我倾向于使用
    memberchk/2
    ,这就是其中之一。我认为这里用哪一个并不重要。但是你比我更有经验,所以如果你知道一个具体的区别,一个我应该使用它的原因,我会的。