SWI Пролог: списки различий - fifo - PullRequest
0 голосов
/ 10 апреля 2011

Я изучаю Пролог, и списки различий для меня супер новы, и, похоже, из ада, тем более, что я определенно бедный простодушный парень на С ++ :) У меня проблема с моей задачей:

addall (-E, + G, + S, -R) добавляет все результаты подстановок для переменной E, которые удовлетворяют цели G (в которой встречается переменная E), в коллекцию S и возвращает новую коллекцию R (этот предикат напоминаетстандартные предикаты findall = 3 и findall = 4).

Я реализовал это с коллекцией LIFO без проблем, но что-то не так с FIFO, рассмотрим следующее использование:

lifo_empty(L), lifo_addall(X,number(odd,X), L, W).

в порядке, коллекция W [8,6,4,2,0], но:

fifo_empty(Q), fifo_addall(X, podstaw(c,X), Q, W).

дает мне W = [9, 7, 5, 3|[1|_G3761]-_G3761].То, что я хочу, это [9,7,5,3,1|_G3761]-_G3761.Я понятия не имею, что не так, особенно в том, что:

?- fifo_empty(Q), fifo_put(a,Q,W), fifo_put(b,W,C).
C = [a, b|_G3922]-_G3922.

работает просто отлично.Мой код:

fifo_empty(X-X).
todiff(X, [X|Xs]-Xs).
fifo_put(E, X-[E|Xs], X-Xs).
fifo_get([E|X]-Xs, X-Xs, E).

fifo_append([],S,S).
fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).

fifo_addall(E, Goal, S, R) :- findall(E,Goal, W), fifo_append(W,S,R).

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

1 Ответ

2 голосов
/ 15 апреля 2011

Может ли это произойти, потому что вы называете lifo_append/3 последней целью в линии:

fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).

... вместо fifo_append/3?Попробуйте изменить последний вызов подцели на fifo_append/3.Проверка вашего кода с этим изменением со следующими фактами:

person(joe).
person(mary).

Дает:

?- fifo_empty(Q), fifo_addall(X, person(X), Q, W).
Q = [joe, mary|_G677]-[joe, mary|_G677],
W = [joe, mary|_G677]-_G677.

... где W привязывается к описанному вами шаблону, после которого вы были.*

...