пролог дополняющих списков - PullRequest
0 голосов
/ 23 июля 2011

У меня есть проблема, я беру на вход список, и я хочу добавить его элемент к другому, который я хочу в выводе

это мой код:

run([],L).
run([X|Y],Lista) :- X =..Total, append(Total,Lista,ListaR), run(Y,ListaR), stamp(ListaR).

stamp([]).
stamp([X|Y]) :- nl, write(X), stamp(Y).

, если я запускаюэто с:

run([p(X,Y,Z),h(Z,P,Q)],[]).

он распечатает:

h
_G238
_G244
_G245
p
_G236
_G237
_G238
p
_G236
_G237
_G238
true.

почему он содержит 2 раза p?что не так?

_GXXX являются переменными ...

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Он печатает p дважды, потому что вы печатаете результат на каждом уровне рекурсии.Если вы хотите распечатать его только один раз в конце, сделайте так:

run([],L) :- stamp(L).
run([X|Y],Lista) :- X =..Total, append(Total,Lista,ListaR), run(Y,ListaR).
1 голос
/ 23 июля 2011

Для добавления списков вам не нужно писать эту рекурсивную функцию append/3 сделайте это за вас.

?- append([a,b],[k,l],NewList).
NewList = [a, b, k, l].

Но я попробовал ваш код на swi-прологе, но он не выдаст ваш вывод, ноэто дает неправильный результат, потому что вы печатаете список более одного в рекурсивной части.Вы можете попробовать что-то подобное

run(List1,List2) :- append(List1,List2,ListResult), stamp(ListResult).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...