2016-11-04 40 views
0

在序言中,我有一個計算列表長度的規則。我想知道我的清單是否已預先定義,我該怎麼辦?序言長度預定義列表

例如,在基地我

list1[1,2,3,4,3,5,8]. 

longueur([],0). 
longueur([_|Y],N) :- longueur(Y,M), N is M+1. 

而在序言中我進入longueur(list1,N).我一直歌廳false.

+1

'李st1 [1,2,3,4,3,5,8] .'不正確的語法,特別不意味着'list1 = [1,2,3,4,5,6,7,8]' 。 – Fatalize

+0

但我沒有得到任何錯誤! – bttX

+1

你使用什麼分佈?在SWI-Prolog上,出現以下錯誤,如預期的那樣:'錯誤:c:/test.pl:1:5:語法錯誤:操作員期望'。 – Fatalize

回答

0

longueur(list1,N).是假的,因爲list1不是一個列表,所以不匹配任何你寫的longueur/2的兩條規則。

爲了得到它的工作,這是你會做什麼:

?- list1(X), longueur(X,L). 
X = [1, 2, 3, 4, 3, 5, 8], 
L = 7. 

如果你想longueur/2list1作爲參數的工作,並與list1([1,2,3,4,5,6,7,8]).事實上,你應該創建一個謂語像longueur_depuis_atome/2

longueur_depuis_atome(A, L) :- 
    call(A, X), 
    longueur(X, L). 

然後:

?- longueur_depuis_atome(list1,L). 
L = 7. 
+0

現在,我理解你。所以在序言中,我應該把這個列表放入一個變量中。 謝謝 – bttX

+0

它的工作。但我不明白longueur_depuis_atome。你能否更詳細地向我解釋一下。 – bttX

+0

@bttX'call(A,X)'的結果與您在解釋器中編寫「A(X)」的效果相同(但顯然適用於任何值「A」)。所以如果'A = list1','call(A,X)'就像你寫了'list1(X)'一樣,這使得'X = [1,2,3,4,5,6 ,7,8]'通過模式匹配。然後,我們稱之爲longueur/2,因爲這就是我們想要的...... – Fatalize