2016-02-03 2 views
2

Это будет мой первый вопрос о переполнении стека.
Я читал руководство learnPrologNow, а затем начал делать упражнения в главе 3, ответы, которые дал мой компилятор, были не такими, как я ожидал (и я не думаю, что должен был выйти). Таким образом, я проверил его с примерами книга дала мне:
база знаний:Компилятор LearnPrologNow не работает должным образом

child(anne,bridget). 
child(bridget,caroline). 
child(caroline,donna). 
child(donna,emily). 
descend(X,Y) :- child(X,Y). 
descend(X,Y) :- child(X,Z), descend(Z,Y). 

Поэтому я попросил компилятор:

12 ?- descend(bridget,caroline). 
true ; 
false. 

13 ?- descend(caroline,bridget). 
false. 

Где вторая ложь (12) происходят из ? Это также произошло в Excersise 3.2 (которого я взял со страницы GitHub, чтобы проверить правильный) с базой знаний:

greater_than(succ(X),0). 
greater_than(succ(X),succ(Y)) :- 
      greater_than(X,Y). 

с ответами:

14 ?- [ex32]. 
Warning: c:/users/user/documents/prolog/ex32.pl:1: 
     Singleton variables: [X] 
true. 

15 ?- greater_than(3,2). 
false. 

16 ?- greater_than(2,3). 
false. 

Я использую SWI-Prolog 7.2 .3 64-разрядная версия.
Любые предложения, что может быть неправильным?

+1

Добро пожаловать в Stack Overflow! Я отредактировал ваш вопрос. Если вы не согласны с моим редактированием, вы можете отбросить его назад. Чтобы перевернуть править назад, нажмите ссылку «отредактировано ... назад». Это приведет вас к истории изменений, где находятся кнопки отката. Кроме того, рассмотрел ваш вопрос, потому что вы показываете, что провели какое-то исследование перед публикацией здесь. Наслаждайтесь своим пребыванием! –

+0

Поскольку часто бывает сложно объяснить, что именно происходит, вводные учебники предпочитают даже не пытаться объяснить. Это вопрос вкуса. Это по-прежнему лучший доступный учебник онлайн. –

ответ

2

Второй результат false получен из SWI Prolog, пытающегося продолжить вывод информации.

После первого true вы попадаете в пробел, затем SWI Prolog начинает обратный отсчет, чтобы узнать, что еще он может вывести. Он не может установить новый вывод descend(bridget,caroline), так что на этот раз результат false, а конец возврата.

+0

спасибо за ответ ^^, я понимаю это сейчас. –

3

Другой ответ объясняет вашу первую проблему. Вторая проблема другая. Вы должны использовать натуральные числа в обозначениях преемников, поэтому вместо 0, 1, 2, 3, ... вам нужно использовать 0, succ(0), succ(succ(0)), succ(succ(succ(0))), ....

Это один из наиболее известных ранних примеров Prolog, и вы можете найти много вопросов об этом здесь, в разделе «Переполнение стека», и многие примеры его в другом месте в Интернете. Мое личное мнение состоит в том, что выполнение арифметики в преемственных обозначениях просто безумие, но если вы заинтересованы, попробуйте найти «арифметику peano» или, возможно, «арифметику преемника», like this.

Если вы хотите сравнить арифметические, используйте arithmetic predicates. С теми, вы можете сравнить цифры и арифметические выражения:

?- 2 > 3. 
false. 

?- 3 < 4. 
true. 

?- 1+2+3 =< 6. 
true. 

Для сравнения произвольных условий, которые вы можете использовать предикаты, которые сравнивают по standard order of terms. Обратите внимание, что в некоторых случаях вы получите разные ответы:

?- 1+2 > 99999. 
false. 

?- 1+2 @> 99999. 
true. 

В документации объясняется, почему. Кстати, это также объясняет, почему естественные числа в обозначениях преемников сравниваются правильно, если вы используете стандартный порядок терминов:

?- s(s(0)) @> s(0). 
true. 

?- s(s(0)) @< s(0). 
false. 
+0

Благодарим вас за быстрый ответ: D. Я удалил преемников и поставил «больше» (X, Y): - X @> Y. " в базе знаний, вместо этого. Будет также проверяться арифметика преемника позже. –

+0

@CelalKarakoc Это немного лишний и немного неправильный. Я отредактирую свой ответ с некоторыми подробностями об этом. –

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