В основном мне интересно, почему одно из моих определений для нового предиката g
приводит к тому, что мой запрос заканчивается на «ложь», а другое определение сразу возвращается к «?-».
Учитывая такую базу данных:
f(a,b).
f(b,c).
f(c,d).
Я хочу создать новый предикат, представляющий своего рода транзитивное замыкание f
с добавлением того, что он также должен включать список того, как был создан элемент. т.е. Я хочу g
такие, что ?- g(X,Y,Z).
будет производить это:
g(a,c,[f(a,b),f(b,c)]).
g(b,d,[f(b,c),f(c,d)]).
g(a,d,[f(a,b),f(b,c),f(c,d)])
Я ввожу вспомогательный предикат конкатенации:
con([],L,L).
con([X|L1],L2,[X|C]):-con(L1,L2,C).
И тогда моя попытка решения будет такой:
g(X,Z,[f(X,Y),f(Y,Z)]):-f(X,Y),f(Y,Z).
g(X,Z,C):-f(Y,Z),g(X,Y,L),con(L,[f(Y,Z)],C).
Пока производится правильный вывод, в конце печатается дополнительная false.
:
?-g(X,Y,Z).
X = a,
Y = c,
Z = [f(a, b), f(b, c)] ;
X = b,
Y = d,
Z = [f(b, c), f(c, d)] ;
X = a,
Y = d,
Z = [f(a, b), f(b, c), f(c, d)] ;
false.
В то время как простое определение, подобное этому:
g(X,Y):-f(X,Y).
производит
g(a,b).
g(b,c).
g(c,d).
без "ложного".
Означает ли это, что в моей программе есть ошибка? Если да, то что это?
The Problem of Transitive Closure
- person Guy Coder   schedule 08.11.2018