Prolog在列表中的唯一值

时间:2017-05-31 16:10:44

标签: prolog

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

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

此函数的标题是uniqueValues(X)X - 平均值列表。我真的不懂这种语言,如果有人能解释我如何创建这个功能会很棒。谢谢你的帮助

1 个答案:

答案 0 :(得分: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中表示“not”,memberchk/2告诉您某些内容是否在列表中。因此memberchk(1, [2,3,4])将失败,\+将失败转为成功。这很好!此外,使用[1,2,1],X将等于1,X将等于[2,1],memberchk/2将成功,然后被否定为失败。这可能就是我们想要的!

将它与递归调用放在一起,就可以得到整个谓词:

unique([]).
unique([X|Xs]) :- \+ memberchk(X, Xs), unique(Xs).
  1. 空列表是唯一的。
  2. 非空列表([X | Xs])在以下情况下是唯一的:
    1. Xs不包含X和
    2. Xs也很独特