Приступая к работе с Прологом и явно имейте фундаментальное недопонимание, как это работает, помогите? - PullRequest
3 голосов
/ 10 февраля 2011

Я запускаю свои первые несколько программ на Прологе и наткнулся на препятствие в виде эксперимента, который я пытаюсь запустить.Первоначально я делал это на мини-карте нескольких штатов США, но я упростил ее до алфавита:

adj(a,b).
adj(b,a).
adj(b,c).
adj(c,b).
adj(c,d).

na(X, Z) :- \+adj(X, Z).

Когда я запрашиваю na (a, Что). Iя не получаю никаких ответов (просто нет), но если я индивидуально проверю na (a, d) , это, естественно, естественно возвращает да.

Какое объяснение, почему это будетслучиться?Мне удалось заставить другие запросы работать в разных программах, поэтому мне интересно, какую ключевую информацию мне не хватает.Спасибо!

1 Ответ

6 голосов
/ 10 февраля 2011

Думайте о (\ +) / 1 не как логическое отрицание, а как "не доказуемое".\+ na(a, What) успешен тогда и только тогда, когда na(a, What) не доказуемо.Поскольку na(a, What) дает по крайней мере одно решение и, следовательно, доказуемо, его отрицание (в этом смысле) не удается .(\ +) / 1, таким образом, является логически неполным: в этом случае он терпит неудачу, хотя, как вы заметили, существуют базовые значения, которые могли бы сделать его успешным.Однако (\ + / 1) работает так, как вы ожидаете от логического отрицания, если его аргумент является обоснованным.Поэтому вы можете решить ее, например, с помощью

na(X, Y) :- country(X), country(Y), \+ adj(X, Y).

, где страна / 1 дает наземные экземпляры стран.Другой способ решить это - явно перечислить страны, которые не являются смежными, что возможно, поскольку домен конечен.Преимущество этого подхода в том, что ваши запросы монотонны: добавление новых фактов никогда не приведет к сбою запроса, который ранее был успешно выполнен (это не выполняется при использовании (\ +) / 1, как указано выше).Это хорошее свойство для декларативной отладки.

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