Как можно добавить список списков в прологе? - PullRequest
1 голос
/ 25 марта 2020

Мне нужен предикат, который плюс список списков в прологе с использованием чистой логики c и натуральных числовых обозначений. Например, для предиката:

?-totalPlus([ [s(0)],[s(0),s(0)],[s(s(0))] ], Res).

Результат должен быть следующим:

Res= s(s(s(s(s(0))))).

Это моя реализация, но она возвращает только плюс первого списка:

    plusNat(0,X,X).
    plusNat(s(X),Y,s(Z)):-plusNat(X,Y,Z).

    plusList([],0).
    plusList([X|Xs], S) :- plusList(Xs,SXs), plusNat(X,SXs,S).

    totalPlus([],_).
    totalPlus([X|Xs],Y):-totalPlus(Xs,_), plusList(X,Y).
    ------------------

    ?-totalPlus([ [s(0)],[s(0),s(0)],[s(s(0))] ], Res).
      Res= s(0).

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Я, наконец, добавил предикат плюс для накопления результата, это возможное решение, и оно работает:

plusNat(0,X,X).
plusNat(s(X),Y,s(Z)):-plusNat(X,Y,Z).
plusList([],0).
plusList([X|Xs],S) :- plusList(Xs,SXs), plusNat(X,SXs,S).
totalPlus([],0).
totalPlus([X|Xs],Y):-totalPlus(Xs,Z), plusList(X,K), plusNat(K,Z,Y).
0 голосов
/ 27 марта 2020

Может быть лучше реализовать plusList/2 с помощью предиката-помощника plusList/3, который использует аккумулятор, например:

plusList(L, S) :-
    plusList(L, 0, S).

plusList([], S, S).
plusList([H|T], Si, So) :-
    plusNat(H, Si, S),
    plusList(T, S, So).

Приятно то, что мы можем использовать этот предикат-помощник для Избегайте двойной работы, когда мы складываем суммы подсписков вместе для totalPlus:

totalPlus(LL, S) :-
    totalPlus(LL, 0, S).

totalPlus([], S, S).
totalPlus([H|T], Si, So) :-
    plusList(H, Si, S),
    totalPlus(T, S, So).
...