列表中的Prolog唯一值

Mat*_*zak 2 prolog

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

[1,2,3,5] - true
[1,2,2,4] - false
Run Code Online (Sandbox Code Playgroud)

该函数的标题是uniqueValues(X)X-均值列表。我真的不懂这种语言,如果有人可以向我解释如何创建此功能,那将是很好的。感谢您的帮助

Dan*_*ons 5

不了解Prolog,这有点麻烦,但是让我们尝试一下。在Prolog中,函数通过递归而不是迭代来工作。对于列表处理,这意味着(通常),您必须决定如何处理空列表以及如何处理其他列表前面的元素。因此,首先,您需要对空白列表做出决定。

unique([]).
Run Code Online (Sandbox Code Playgroud)

这说“空列表是唯一的”。这是一个有用的属性。

递归情况假设您已经知道如何处理列表的其余部分。在像这样的“普通”递归列表处理谓词中,您倾向于具有这种结构:

foo([X|Xs]) :- /* do something with X */, foo(Xs).
Run Code Online (Sandbox Code Playgroud)

foo(Xs)有说,“和运行任何剩下的同样的事情。” 因此,我们要问的问题是,如何知道以X开头和以Xs结尾的列表是否唯一?好吧,我们可以确保X是唯一的,并确保它不会出现在列表中的其他位置。像这样:

unique([X|Xs]) :- \+ memberchk(X, Xs).
Run Code Online (Sandbox Code Playgroud)

考虑你的例子[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).
Run Code Online (Sandbox Code Playgroud)
  1. 空列表是唯一的。
  2. 在以下情况下,不为空的列表([X | Xs])是唯一的:
    1. Xs不包含X,并且
    2. Xs也很独特

  • @PauloMoura为什么在这种情况下我更喜欢会员? (2认同)