Сказать, что только птицы могут летать может быть выражено как, если существо может летать, то он должен быть птицей. В зависимости от семантики этой краткой фразы она может оставить открытой возможность того, что могут быть птицы, которые не могут летать.
Таким образом, предикат:
fly(X) :- bird(X).
не будет ли это правильно. Это говорит о том, что , если X
является птицей, то X
может летать, что не то, что только птицы могут летать говорит, логично.
Более прямой перевод на Прологе бы тогда:
bird(X) :- fly(X).
Он говорит, что, X
птица, если X
может летать (или, если X
может летать, то X
должен быть птицей).
Исключительность только будет происходить из-за отсутствия любого другого предиката, который говорит, что некоторые другие существа могут летать, например:
bee(X) :- fly(X).
Что касается второго вопроса:
go_there(X,Place):-
go_there(X,zoo),
go_there(X,library).
Это говорит о том, что X
отправляется в Place
, если X
отправляется в зоопарк, а X
отправляется в библиотеку. Это звучит совсем не так, X
может либо пойти в зоопарк, либо в библиотеку, но не оба.Я мог бы сказать что-то вроде:
go_there(fred, zoo).
go_there(fred, library).
Они говорят, что fred
может пойти в зоопарк, или fred
может пойти в библиотеку.
И потом, если я запрашиваю:
go_there(fred, Place).
Это даст два различных результата для Place
:
Place = zoo
Place = library
Сказать, что X
может пойти в один или другой, но не оба, требует квалификация. Означает ли это в течение определенного периода времени, что X
не может перейти к обоим? Или это означает, что как только X
подходит к одному, тогда он никогда не сможет переходить к другому? Неясно, удовлетворяет ли указанный выше предикат первому случаю. Это зависит от контекста. В любом случае вам нужно добавить некоторую логику Prolog для обработки либо временного аспекта, либо, если случай «навсегда» вам понадобится случайный выбор того или другого, а затем этот выбор останется постоянным от этот момент вперед.
В ответ на дополнительные замечания, если сказать:
go_there(human(fred), zoo).
go_there(human(fred), library).
Вы выбираете, чтобы представить человека, такие, как fred
, как человек с помощью функтора, human/1
. Чтобы обозначить fred
как человека, вы должны нести функтора вокруг с fred
и всегда ссылайтесь на fred
как human(fred)
всякий раз, когда используется в предикате, который ищет членство в человеческом роде. Если вы хотите спросить, подходит ли fred
в зоопарк, то go_there(fred, zoo).
потерпит неудачу, поскольку тот факт, что fred
является человеком, должен быть частью атома, представляющим fred
. Вам нужно будет запросить, go_there(human(fred), zoo)
. Чтобы определить, является ли fred
человеком, вы бы запросили, go_there(human(fred), _).
, что также немного неудобно.
Разделяя отношения понятнее:
go_there(fred, zoo).
go_there(fred, libary).
human(X) :- go_there(X, zoo).
human(X) :- go_there(X, library).
Теперь, если вы запрашиваете, human(fred).
, вы получите "истинный". И если вы запрашиваете, go_there(fred, zoo)
, вы также получите «true».
Это не относится к SWI Prolog, не так ли? – lurker
@lurker, у меня есть нерешенная проблема с моими собственными кодами в SWI-прологе. Я хочу, чтобы кто-то мог указать, где я поступил неправильно, с точки зрения моей логики ... Как вы думаете, вы можете помочь здесь? :) – user3004159
Если у вас есть еще одна конкретная проблема с вашим кодом, можете ли вы сформулировать ее в другом вопросе, который вы можете опубликовать на stackoverflow.com? – lurker