2017-05-31 63 views
1

我在大學考試時使用Prolog語言進行考試,我不知道如何創建函數:在列表中檢查唯一值。我的意思是,如果列表中的每個值都是唯一函數,則返回true,否則返回false。例如。列表中的Prolog唯一值

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

該函數的標題是uniqueValues(X)X - 均值列表。我真的不知道這種語言,如果有人能解釋我如何創建這個功能將是偉大的。謝謝你的幫助

+0

對不起我的壞,改變。 –

+0

檢查這個帖子出來:https://stackoverflow.com/questions/2426484/how-to-find-differences-in-lists-in-prolog-and-determine-if-the-lists-are-the-sa –

回答

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中表示「不」,並且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 |兩個X])是,如果唯一的:
    1. 兩個X不包含X,和
    2. 兩個X也是唯一
+0

非常感謝你的解釋 –

+0

'\ + memberchk(X,XS)' - >'\ +會員(X,XS)' –

+1

@PauloMoura爲什麼我會喜歡成員在這種情況下? –