Дополнительный «false» в конце запроса

В основном мне интересно, почему одно из моих определений для нового предиката 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).

без "ложного".

Означает ли это, что в моей программе есть ошибка? Если да, то что это?


person azureai    schedule 07.11.2018    source источник
comment
Дополнительные ложные значения означают, что Пролог не смог найти никаких дополнительных решений после того, как предложил то, что уже предложил.   -  person lurker    schedule 08.11.2018
comment
@lurker Так почему же при запросе предиката, определенного простым определением g (X, Y): -f (X, Y), нет дополнительного false? Я не понимаю разницы.   -  person azureai    schedule 08.11.2018
comment
Что касается транзитивного замыкания, вы можете найти книгу The Craft of Prolog. и прочтите Раздел 5.4 The Problem of Transitive Closure   -  person Guy Coder    schedule 08.11.2018
comment
@azureai, потому что в этом случае не было точки выбора. Это означает, что в этом случае Пролог знает, что не было других вариантов для тестирования/исследования, которые могут быть успешными или нет.   -  person lurker    schedule 08.11.2018
comment
@lurker Понятно, большое спасибо. Должен ли я удалить этот вопрос?   -  person azureai    schedule 08.11.2018
comment
Рад, что смог помочь. Вы можете оставить вопрос. Сообщество может удалить его, если сочтет нужным.   -  person lurker    schedule 08.11.2018