2014-12-07 56 views
0

我必須編寫一個謂詞,它將列表中的所有項目相加。這些項目可以是列表中的列表。例如, sum1([1,[2,3],4,[5]],X)。 我有一些代碼,應該工作,但是給一個參數沒有充分實例化的錯誤。我對prolog非常陌生,但這些對我來說看起來很好。這裏是我這個謂詞(功能)全碼序言總和所有投擲錯誤

suml([],0). 
suml([H|T],X) :- atomic(H),S2 is H + X, suml(T,S2). 
suml([H|T],X) :- suml(H,S1), S3 is S1 + X, suml(T,S3). 

回答

0

更改以下兩個條件的順序:S2 is H + X, suml(T,S2)和改變你使用is/2的方式。雖然這是邏輯編程,但規則中條件的順序很重要。先將sum1(T, S2)放在第一位,因爲在計算總和之前需要實例化S2。其次,is算術評估正確的部分,並與左邊的部分相結合。所以,你真的想總結S2H得到X

suml([H|T],X) :- atomic(H), suml(T,S2), X is H + S2. 
+0

再次感謝您!我試過這第二行,但它不工作 suml([H | T],X):suml(T,X),suml(H,S1),S1 + X.基本上這就是說如果我有一個列表,總結這一點,並添加它。但這是行不通的,我即將開始undefined程序 – 2014-12-08 00:31:43

+0

nvm!我錯了,因爲教師的例子,我被X中的代碼弄糊塗了......我現在明白了,它應該是suml([H | T],X): - suml(T ,S1),sum1(H,S2),X是S1 + S2。 – 2014-12-08 00:34:37