GNU Prolog - цикл и новый список - PullRequest
       13

GNU Prolog - цикл и новый список

3 голосов
/ 16 декабря 2010

Это просто общий вопрос, проистекающий из чего-то другого.

Скажем, вы хотите таблицу продуктов из матрицы (думаю, так она называется).

Пример, который я положил в

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 ]

2 голосов
/ 16 декабря 2010
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 голос
/ 16 декабря 2010

Вот еще один, он использует карту вместо добавления. Dot-продукты производятся для продуктов, не имеющих номера. Это также детерминистично.

Множитель:

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