2016-02-28 3 views
1

Я только что понял, как запустить gprolog, и новая проблема пролога смутила меня. Проблема относится к бинарному дереву поиска в прологе, предположиткак представлять функцию ИЛИ в прологе

 8  
    /\ 
    3 10 
/\ 
1 6 

здесь есть два вида фактов, которые оставили (X, Y), когда X является левый листа Y и вправо (X, Y), когда X является правый лист Y, поэтому я могу сказать левый (3,8) и левый (1,3) и правый (10,8) как мои факты. Выполнить правило выше (X, Y), когда X выше Y в терминах фактов? Так что я имею в виду, это X выше Y, если Y является левый лист X OR Y является правильным лист X.

Я попробовал правило

above(X,Y) :- left(Y,X); right(Y,X). 

Когда я запускаю выше запрос (3 , 1) в gprolog. он спросил меня правду? когда я нажимаю enter, и он возвращает yes и когда я нажимаю «;» и он не возвращает ничего, потому что система продолжает искать второй гол «right (1,3)». Я просто странствую там, где это возможно, да, независимо от того, я нажимаю ввод или точку с запятой?

ответ

0

Если я правильно понимаю, (соответствующая часть) ваш код

left(1,3). 
above(X,Y) :- left(Y,X); right(Y,X). 

И ваш запрос:

?-above(3,1). 

Запрос возвращает истину первым, потому что ваша цель достигнута. Затем он спрашивает вас, хотите ли вы найти другие результаты (точка с запятой), вы говорите ему, чтобы продолжить и искать другими способами, чтобы доказать свою цель, и он отвечает, что другого пути нет (отсюда «нет» «).

Вы спрашиваете, есть ли способ изменить правильное поведение gprolog так, чтобы он ответил «да» на этот второй вопрос?

Теоретически возможно переопределить свой собственный компилятор Prolog и заставить его выводить «да», когда это означает «нет», но зачем такое? Кроме этого, нет, вы не можете это изменить.

+0

Да, вы правильно поняли. Причина, по которой я хочу это сделать, делает пролог более умным, если он может признать, что в одной из целей есть истина. Причина, когда я пробовал более правильное правило, как anywayabove (X, Y): X является предком Y, мне все равно нужно рассмотреть вопрос о продолжении поиска или не вопрос. Это своего рода мои вычисления, но не пролог. Я подумал: "; в пункте означает, что он возвращает да, если один из целей согласован независимо от того, что он ведет поиск или нет. Имеет ли это смысл? – user1234567

+0

@ user1234567 Я не думаю, что это сделает пролог умнее. Но получайте удовольствие программирования, что новый компилятор! – ZakC

Смежные вопросы