我在大学期间使用Prolog语言进行考试,但我不知道如何创建函数:检查列表中的唯一值。我的意思是,如果列表中的每个值都是唯一函数,则返回true,否则返回false。例如。
[1,2,3,5] - true
[1,2,2,4] - false
Run Code Online (Sandbox Code Playgroud)
该函数的标题是uniqueValues(X)X-均值列表。我真的不懂这种语言,如果有人可以向我解释如何创建此功能,那将是很好的。感谢您的帮助
不了解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)