Попытка распечатать предварительный заказ в прологе - PullRequest
0 голосов
/ 15 декабря 2018

Я реализую двоичное дерево поиска в прологе и пытаюсь получить распечатки для каждого типа обхода, preOrder, inOrder и postOrder.

Мое тестовое дерево: bst(bst(bst(empty,2,empty),4,empty),5,bst(bst(empty,6,empty),8,empty)).

Вот что у меня есть:

preOrder(bst(_,X,_)) :- write(X).
preOrder(bst(L,_,_)) :- preOrder(L).
preOrder(bst(_,_,R)) :- preOrder(R).

И это работает, но пользователь должен нажать пробел, чтобы получить каждый элемент.

5
True
4
True
2
True
8
True
6
False

Я бы предпочел распечатать егов форме 5 4 2 8 6

Поэтому я изменил код выше:

preOrder(bst(L,X,R)) :- write(X), write(" "), preOrder(L), preOrder(R).

Теперь он только распечатывает 5 4 2 false

IЯ новичок в прологе, может кто-нибудь объяснить, почему добавление отдельных предикатов в один предикат действует не так, как 3 отдельных?

1 Ответ

0 голосов
/ 15 декабря 2018

Почему добавление отдельных предикатов в один отдельный предикат действует не так, как 3 отдельных?

Предикат с несколькими предложениями (то, что вы называете отдельными предикатами) оценивается как ORи один предикат предложения с несколькими операторами, разделенными ,, оценивается как AND.

Если вы измените это

preOrder(bst(L,X,R)) :-
    write(X),
    write(" "),
    preOrder_04(L),
    preOrder_04(R).

, которое также можно записать как

preOrder(bst(L,X,R)) :-
    write(X),
    write(" "),
    (
        preOrder_04(L)
    ,
        preOrder_04(R)
    ).

до

preOrder(bst(L,X,R)) :-
    write(X),
    write(" "),
    (
        preOrder_04(L)
    ;
        preOrder_04(R)
    ).

тогда вы получите то, что ищете.


Поскольку вы новичок в Прологе, я также дам вам обзор вашего кода.

Чтобы использовать исходное дерево и предикаты

bst(bst(bst(empty,2,empty),4,empty),5,bst(bst(empty,6,empty),8,empty))

preOrder(bst(_,X,_)) :- write(X).
preOrder(bst(L,_,_)) :- preOrder(L).
preOrder(bst(_,_,R)) :- preOrder(R).

Я сделал это

tree(bst(bst(bst(empty,2,empty),4,empty),5,bst(bst(empty,6,empty),8,empty))).

test_01 :-
    tree(T),
    preOrder_01(T).

preOrder_01(bst(_,X,_)) :- write(X).
preOrder_01(bst(L,_,_)) :- preOrder_01(L).
preOrder_01(bst(_,_,R)) :- preOrder_01(R).

, строка tree(T) прочитала дерево как факт и затем привязала дерево кпеременная T, чтобы мне не приходилось вводить ее каждый раз.

Затем я создал тестовый предикат с именем _01, чтобы не вступать в конфликт с другим предстоящим тестом.

Пример прогона:

?- test_01.
5
true ;
4
true ;
2
true ;
8
true ;
6
true ;
false.

Почему вы должны нажать на спаСе бар после каждого ответа?

(Это было сделано с помощью SWI-Prolog).

Этот пример показывает, почему.

test_02 :- write("First").
test_02 :- write("Second").

?- test_02.
First
true ;
Second
true.

Каждый раз, когда выполняется предикат test_02/0, это приводит к решениюи когда решение дается, вы должны нажать пробел, чтобы увидеть следующее решение.

Также обратите внимание на ; в конце первого ответа.Это Пролог, говорящий вам, что точка выбора существует, и может быть другой ответ.Если бы это был ., то больше не было бы ответов.


Для вашего перезаписи, который не работает

preOrder_03(bst(L,X,R)) :-
    write(X),
    write(" "),
    preOrder_03(L),
    preOrder_03(R).

test_03 :-
    tree(T),
    preOrder_03(T).

Пример выполнения:

?-  test_03.
5 4 2 
false.

Если вы запустите его с трассировкой, вы увидите, что она не достигает точки выбора.
См. Что такое повтор в Prolog при трассировке?


Однако, если вы сделаете это

preOrder_04(bst(L,X,R)) :-
    write(X),
    write(" "),
    (
        preOrder_04(L)
    ;
        preOrder_04(R)
    ).

test_04 :-
    tree(T),
    preOrder_04(T).

Пример запуска:

?- test_04.
5 4 2 8 6 
false.

Вы получите то, что ищете.Ключевое различие между preOrder_03 и preOrder_04 заключается в том, что preOrder_03 имеет , в одном месте и preOrder_04 имеет ; в одном месте.Запятая (,) - это логическая AND, а точка с запятой (;) - это логическая OR.

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