2008-12-08 88 views
1

我試圖做一個列表的函數,它將內部列表的總和乘以外部列表。 到目前爲止,我可以總結一個列表,我做了一個函數sumlist([1..n],X),它將返回X =(結果)。但我不能得到另一個功能,以有用的功能工作,我已經嘗試都是和=無濟於事。在序言中傳遞結果

+0

請說明。目前還不清楚什麼是「內部」和「外部」列表。 – atzz 2008-12-08 16:36:57

回答

1

的部分「乘以它與外部列表中的內部列表的總和」是不是真的不清楚,但我相信你的意思是,給定數字列表的列表[L1,...,Ln],你要計算S1*..*Sn其中SiLi(每個i)中元素的總和。

我假定的plusmult存在與他們的明顯含義(例如plus(N,M,R)保持精確時R等於N+M)。首先,我們需要謂詞sum,使得sum(L,S)在並且僅當SL的元素的總和時成立。如果L是空的,S顯然必須0

sum([],0). 

如果L不是空的,但形式[N|L2],那麼我們有S必須N加上L2元素的總和S2。換言之,我們必須同時具有sum(L2,S2)(以使S2成爲L2的元素的總和)和plus(N,S2,S)。那就是:

sum([N|L2],S) :- sum(L2,S2), plus(N,S2,S). 

在你能找出p你正在尋找的謂詞一樣。當且僅當RS1Sn的產品時,我們希望p(L,R)成立,其中L=[L1,...,Ln]sum(Li,Si)適用於所有i。如果L是空的,R必須1

p([],1). 

如果L不是空的形式[LL|L2]的,但是,我們有R必須是「S」的產品中,LL元素的總和,和'P',是L2中列表總和的乘積。對於S我們已經有sum(LL,S),所以這給了我們以下。

p([LL|L2],R) :- sum(LL,S), p(L2,P), mult(S,P,R). 

有一兩件事我想補充的是,它可能不是一個好主意,看看這些謂詞,你可能會從命令式或函數式編程使用的功能。 sumlist([1,..,n],X)返回X = (result)並非如此; (result)X的值,因此sumlist([1,...,n],X)爲真。這需要有些不同的思想。而不是想「如何計算X使得p(X)成立?」你必須考慮「P(X)何時舉行?」並使用答案(「好吧,如果q(X)或r(X)!」)來制定條款(p(X) :- q(X)p(X) :- r(X))。

2

這是你的意思嗎?

prodsumlist([], 1). 

prodsumlist([Head | Tail], Result) :- 
    sumlist(Head, Sum_Of_Head), 
    prodsumlist(Tail, ProdSum_Of_Tail), 
    Result is Sum_Of_Head * ProdSum_Of_Tail. 

其中sumlist/2是SWI-Prolog內置的。

用例:

?- prodsumlist([[1, 2], [3], [-4]], Result). 
Result = -36. 
0

這裏是Kaarel's answer重寫(這是打算去!),但tail-recursive

prodsumlist(List, Result) :- 
    xprodsumlist(List,1,Result). 

xprodsumlist([],R,R). 

xprodsumlist([Head|Rest],Sofar,Result) :- 
    sumlist(Head, Sum_Of_Head), 
    NewSofar is Sofar * Sum_Of_Head, 
    xprodsumlist(Rest, NewSofar, Result).