2010-12-16 68 views
3

這只是一個普遍的問題,源於別的。GNU Prolog - 循環和新列表

假設你想要矩陣中的產品表(我認爲它就是它所稱的)。

例子我把

outer([1,2,3],[4,5,6],L). 

Then L = [[4,5,6],[8,10,12],[12,14,18]] 

所以我想通過兩個列表進行迭代並創建一個新的列表。

我得到這個:

outer(L1,L2,L3) :- 
    append(LL,[L|RL],L1), 
    append(LE,[E|RE],L2), 
    Prod is L * E, !, 
    append(LE,[Prod|RE], NewL), 
    append(LL,[NewL|RL], L3). 

這是一種接近。我知道我可以使用append遍歷這兩個列表,不知道如何創建一個新的列表。在創建一個全新的列表時總是會遇到麻煩。

謝謝。

回答

2
product([],_,[]). 
product([H1|T1],L2,R):- mul(H1,L2,R1),product(T1,L2,R2),append([R1],R2,R). 

mul(X,[],[]). 
mul(X,[H|T],[Z|R]):-Z is X*H, mul(X,T,R). 
1

這是另一個,它使用地圖而不是追加。針對涉及非數字產品的點積產品。這也是確定性的。

乘法器:

amul([], _Other_Row,[]). 
amul([X|Xs],Other_Row,[Row_Out|Rest_Out]) :-  
    maplist(mul(X),Other_Row, Row_Out), 
    amul(Xs,Other_Row, Rest_Out). 

產物謂詞:

mul(X,Y, Prod) :- 
    (number(X), number(Y) 
    -> Prod is X * Y 
    ; true 
    -> Prod = dot(X,Y) 
    ). 

[1,3,5] X [2,4,6]

?- amul([1,3,5], [2,4,6],Prod). 
Prod = [[2, 4, 6], [6, 12, 18], [10, 20, 30]]. 

並[a, b,c] X [1,2,3,4]

?- amul([a,b,c],[1,2,3,4],Prod). 
Prod = [[dot(a, 1), dot(a, 2), dot(a, 3), dot(a, 4)], 
     [dot(b, 1), dot(b, 2), dot(b, 3), dot(b, 4)], 
     [dot(c, 1), dot(c, 2), dot(c, 3), dot(c, 4)]].