Я изучаю Пролог, и списки различий для меня супер новы, и, похоже, из ада, тем более, что я определенно бедный простодушный парень на С ++ :) У меня проблема с моей задачей:
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).
Заранее спасибо.