我在大学时学习Prolog语言考试,我不知道如何创建功能:检查列表中的唯一值。我的意思是,如果列表中的每个值都是唯一函数返回true,否则返回false。例如
[1,2,3,5] - true
[1,2,2,4] - false
此函数的标题是uniqueValues(X)X - 平均值列表。我真的不懂这种语言,如果有人能解释我如何创建这个功能会很棒。谢谢你的帮助
答案 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).