2010-12-16 413 views
3

C'est juste une sorte de question générale, provenant d'autre chose. Dites que vous voulez la table des produits à partir d'une matrice (je pense que c'est ce qu'elle appelle).GNU Prolog - Boucle et nouvelle liste

Exemple i mis en

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

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

donc je veux itérer deux listes et de créer une nouvelle liste.

J'ai obtenu ceci:

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). 

qui est assez proche. Je sais que je peux utiliser ajouter à parcourir les deux listes, pas sûr de savoir comment créer une nouvelle liste. Toujours avoir des problèmes quand il s'agit de créer une liste complètement nouvelle.

Merci.

Répondre

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

En voici une autre, il utilise la carte au lieu d'ajouter. Les produits à points sont produits pour des produits impliquant un non numéro. C'est aussi déterministe.

Le multiplicateur:

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). 

Le prédicat produit:

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)]].