簡體   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