Пролог Печать дерева - PullRequest
0 голосов
/ 27 марта 2020
printtree_3( bt(Label,[],[]) ).
printtree_3( bt(Label,Left,Right) ) :- 
    printtree_3( Left ), 
    printtree_3( Right ), 
    printlabel( Label ).

printlabel( X ) :- write( X ), write( ' ' ).

Я впервые пытаюсь обойти дерево в прологе, и я подумал, что сделаю это, напечатав дерево с чужим кодом, чтобы увидеть, как оно работает лично. Проблема в том, что при попытке запустить этот код я всегда получаю «False» от компилятора swipl.

Например.

?- printtree_3(a(b,c,d)).

возвращает false вместо печати дерева. Я думаю, что мой предикат неправильный, но я не уверен. Опять же, я не беру кредит на предоставленный код, я просто хочу запустить его, чтобы я мог экспериментировать. Если кто-нибудь может объяснить, почему это не работает, я был бы очень благодарен.

1 Ответ

1 голос
/ 27 марта 2020

Сбой (возвращает «ложь»), потому что запрос ложный:

Вы просите

printtree_3(a(b,c,d))

дать дерево с функтором a

Однако в коде определены только предложения для предиката printtree_3, которые принимают аргумент с функтором bt (возможно, «двоичное дерево» больше, чем «вещь с привязкой»):

printtree_3( bt(Label,[],[])      )
printtree_3( bt(Label,Left,Right) )

Ничто не соответствует вашему запросу , Пролог говорит «ложь» (что означает, что нет никаких доказательств того, что printtree_3(a(b,c,d)) является правдой)

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