2015-07-24 3 views
2

Я делаю разрешение разрешения в формальной логике с использованием таблицы истинности и результатов программы прогона моих экспериментов, и я хочу знать почему.Prolog - resolution

В данном случае проблема в простом английском: 1. Если кто-то смотрит в глаза истребителю, он разозлится. 2. Если истребитель рассердится, он собирается ударить.

Если истребитель ударил, кто-то заглянул в глаза бойца?

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

Однако после программы пролог SWI возвращает истину:

eyes:-angry. 
angry:-punch. 
punch. 
?-eyes. 
True 

Также

aggregate_all(count, (eyes), Count) 
1 

Может кто-нибудь объяснить это?

ответ

3

Помните, что :- в Прологе должен выглядеть как стрела — стрелкой справа налево, как <==. (На самом деле мы не используем стрелку, чтобы пользователи могли свободно определять пользовательский оператор и использовать его в своих целях, не мешая регулярному коду Пролога.)

Таким образом, все ваши стрелки указывают в неправильном направлении. Вы, вероятно, имел в виду:

angry(true) :- eyes(true). 

punch(true) :- angry(true). 

Я вношу логическое рассуждение для этих предикатов, так что вы можете играть с различными параметрами, не беспокоясь о (не) существования каких-либо предикатов.

Например, если добавить к этим статьям:

eyes(true). 

Тогда вы получите:

?- punch(T). 
T = true. 

Однако, если вы вместо того, чтобы добавить:

eyes(false). 

тогда вы получите:

?- punch(T). 
false. 

Это показывает, что да, кто-то, должно быть, смотрел на человека в глаза.

+1

Спасибо, что объяснили, как работает пролог - это было какое-то время. Однако я думаю, что отвечу на вопрос: «Если истребитель ударил, кто-то заглянул в глаза бойца?» не может быть дан ответ, потому что истина-истребитель ударил все еще в заключение. сердитый (правда): - глаза (правда). удар (правда): - сердитый (правда). удар (правда). ? -Eyes (T) Нет ответа –

+1

На выходе, который я показал, вы знаете, что если бы никто не смотрел на бойца в глаза, то никакого удара не было. Эрго, если истребитель * пробил, то кто-то, должно быть, посмотрел на бойца в глаза. Кстати, вы также должны действительно изучить ограничения CLP (B), доступные, например, в SICStus Prolog, GNU Prolog и т. Д., для моделирования задачи над булевыми переменными, где вы можете легко заявить все требования и искать решения. – mat