2016-01-07 89 views
0

我試圖使用printlist/1謂詞來總結所有清單,但那種被困人數....試圖拿出來總結所有號碼這個代碼,但我不斷收到false使用在序言中的printList/1謂詞在列表

這裏是我想出來的:

printlist([]). 
printlist([H|T], Totalsum) :- 
    print (H+Totalsum), 
    nl, 
    printlist(T, Totalsum). 

我知道這是錯誤的,它可能是最後一部分。任何幫助表示讚賞!

我查詢這種方式:

?- printlist([1,2,3]). 
false. 

回答

2

正如保羅已經說了,你在這裏定義兩個謂詞,這是不正確。

這裏是解決方案:

printlist([], 0). 
printlist([H|T], Sum) :- 
    printlist(T, Subsum), 
    Sum is Subsum + H. 

樣品查詢:

?- printlist([1,2,3,5], L). 
L = 11. 

@聖保羅的要求),尾遞歸版本:

printlist(L, Sum) :- 
    sumac(L, 0, Sum). 

sumac([], Acc, Acc). 
sumac([H|T], Acc, Sum) :- 
    Nacc is Acc + H, 
    sumac(T, Nacc, Sum). 
+1

你能否跟進另一個謂詞定義,即*尾遞歸*? –

+0

爲什麼使用名稱'printlist'?這意味着使用副作用,幸運的是,你不使用這些副作用。將謂詞重命名爲「list_sum」或類似的東西如何? – repeat

+1

@repeat。的確,list_sum更好。 – hartmut

1

你確定不是一個而是兩個謂詞:printlist/1printlist/2。可能是一個錯字。 printlist/2謂詞是遞歸規則,但不存在基本情況。將printlist/1子句更改爲:

printlist([], _). 

但是在代碼中還存在其他錯誤。提示:Prolog不是一種功能性語言。

+0

難道我就這麼走了的:打印(H),NL,的printList(T + SUM1),以遞歸調用的printList用尾巴 – Rupert

+0

檢查,如果你叫如發生了什麼'打印(1 + 2)'。 –