我試圖做一個列表的函數,它將內部列表的總和乘以外部列表。 到目前爲止,我可以總結一個列表,我做了一個函數sumlist([1..n],X),它將返回X =(結果)。但我不能得到另一個功能,以有用的功能工作,我已經嘗試都是和=無濟於事。在序言中傳遞結果
在序言中傳遞結果
回答
的部分「乘以它與外部列表中的內部列表的總和」是不是真的不清楚,但我相信你的意思是,給定數字列表的列表[L1,...,Ln]
,你要計算S1*..*Sn
其中Si
是Li
(每個i
)中元素的總和。
我假定的plus
和mult
存在與他們的明顯含義(例如plus(N,M,R)
保持精確時R
等於N+M
)。首先,我們需要謂詞sum
,使得sum(L,S)
在並且僅當S
是L
的元素的總和時成立。如果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
你正在尋找的謂詞一樣。當且僅當R
是S1
至Sn
的產品時,我們希望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)
)。
這是你的意思嗎?
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.
這裏是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).
- 1. 序言遞歸返回多個結果
- 2. 結果傳遞給
- 3. 傳遞結果xhr.onload
- 4. 在Android中傳遞失敗的結果
- 5. 結果集如何在JavaScript中傳遞?
- 6. 如何在Swift中傳遞Realm結果?
- 7. 傳遞Javascript結果到php
- 8. 結果傳遞標籤
- 9. 序言中的重複結果
- 10. 搜索的結果,發現在序言
- 11. 將函數結果傳遞到sqli中
- 12. Firebase上傳失敗:傳遞結果ResultInfo
- 13. 遞歸在序言
- 14. 序言遞歸跳過相同的結果
- 15. 在URL中傳遞語言環境值
- 16. akka演員的留言傳遞順序
- 17. 序言遞歸始終沒有結束
- 18. 在序言語言如何不重複的結果
- 19. 關於參數傳遞(按值傳遞的結果)
- 20. JMeter斷言結果
- 21. 在結果集中排序MySQL結果
- 22. reactjs傳遞迴調結果未定義
- 23. 傳遞數組結果到一個類
- 24. 傳遞的循環結果VAR失敗
- 25. PHP將mysql結果傳遞給變量
- 26. .findOne未將結果傳遞給回調
- 27. 「java.lang.IllegalStateException:無法調用來傳遞結果」
- 28. 傳遞數據庫結果到PHP-MVC
- 29. 將java結果傳遞到命令行
- 30. 將linq查詢結果傳遞給viewmodel
請說明。目前還不清楚什麼是「內部」和「外部」列表。 – atzz 2008-12-08 16:36:57