繁体   English   中英

列表中的Prolog唯一值

[英]Prolog unique value in list

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

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

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

不了解Prolog,这有点麻烦,但是让我们尝试一下。 在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], memberchk/2将成功,然后被否定为失败。 这可能就是我们想要的!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM