2015-01-25 2 views
2

Я смущен о структуре того, как должны записываться правила моего Пролога.Структура правил Пролога и его разность

Скажем, я хочу сказать, что только птицы могут летать.

Если мое правило можно записать в виде

fly(X):- bird(X). 

или

bird(X):-fly(X). 

чем разница в значении между ними? Кроме того, мне нужно явно указать, что если сущность не птица, она не может летать?

Кроме того, если я хочу сказать ... Я могу либо пойти в зоопарк или библиотеку. Или зоопарк или библиотека, но не оба. Как это должно быть? Я предполагаю, что это ..

go_there(X,Place):- 
    go_there(X,zoo), 
    go_there(X,library). 

Перейди нежно на меня, так как это моя первая попытка с программированием Пролог! Спасибо!

+0

Это не относится к SWI Prolog, не так ли? – lurker

+0

@lurker, у меня есть нерешенная проблема с моими собственными кодами в SWI-прологе. Я хочу, чтобы кто-то мог указать, где я поступил неправильно, с точки зрения моей логики ... Как вы думаете, вы можете помочь здесь? :) – user3004159

+0

Если у вас есть еще одна конкретная проблема с вашим кодом, можете ли вы сформулировать ее в другом вопросе, который вы можете опубликовать на stackoverflow.com? – lurker

ответ

1

Сказать, что только птицы могут летать может быть выражено как, если существо может летать, то он должен быть птицей. В зависимости от семантики этой краткой фразы она может оставить открытой возможность того, что могут быть птицы, которые не могут летать.

Таким образом, предикат:

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».

+0

Возможно, я должен был задать вопрос таким образом, чтобы человек мог быть женщиной или мужчиной. Никогда не является тем и другим. Лол. – user3004159

+0

Если бы я спросил его таким образом, не имело бы никакого значения для вышеуказанных правил? – user3004159

+0

Могу ли я быть уверенным, что .. go_there (Human (X), зоопарк). go_there (Human (X), библиотека). также эквивалентен Человек (X): - go_there (X, зоопарк). Человек (X): - go_there (X, библиотека). ? То, что я пытаюсь изобразить в качестве знания здесь, заключается в том, что если что-либо идет либо в зоопарк, либо в библиотеку, он принадлежит человеческому классу ... Я делаю все это неправильно? – user3004159

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