2009-11-30 2 views
1

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

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

edu(X);rich(X) :- member(X). 

Это то, что я написал. Но тогда PROLOG позволяет любым операторам в главном предложении. Я провел 5 часов до сих пор, пытаясь сделать различные вещи с этим заявлением, но не смог достичь решения, которое работает. :(

ответ

2

Смотрите http://en.wikipedia.org/wiki/Horn_clause для утра объяснения формы логики Пролога основан.

Учитывая ваше заявление («Каждый член этого клуба является либо образованным или богатым, или оба.»), Единственными вещами вы можете объявить, чтобы быть правдой являются:..

  • человек образованный, если они являются членами и не богат
  • человек богат, если они являются членами и не образованные

Следующие, например, необязательны:

  • Лицо, состоящее из богатых и образованных, является членом.
  • Член богатого образован.
  • Член, который богат, не образован.
1

Вы не можете комбинировать несколько головок. Если вы хотите edu(X) и rich(X), чтобы быть правдой, когда member(X) верно, вы должны определить их по отдельности («каждый член этого клуба educationed» и «каждый член этого клуба богат»):

edu(X) :- 
    member(X). 
rich(X) :- 
    member(X). 

Сложная часть заключается в том, что ваше первоначальное утверждение не является корректным. В нем говорится, что некоторые члены могут быть богатыми, но не образованными или наоборот. Это проблематично. Например, давайте рассмотрим наивный случай, если член не богат, он образованный, и наоборот:

edu(X) :- 
    member(X), \+ rich(X). 
rich(X) :- 
    member(X), \+ edu(X). 

Теперь, согласно этим правилам, никто не автоматически богат и образованными. Пока мы определяем каждого члена как по крайней мере один из двух, это прекрасно. Однако рассмотреть эти факты:

member(alice). 
member(bob). 
member(charlie). 
member(dave). 

rich(alice). 
edu(bob). 
rich(charlie). 
edu(charlie). 

В этом случае, rich(alice) работает отлично, потому что это факт. edu(alice) приведет к no. Обратное верно для bob. С Чарли мы определили как факты, так и то и другое. Но как насчет дэйва? Оба edu(dave) и rich(dave) относятся к другому, создавая бесконечную рекурсию. Без каких-либо дополнительных знаний о том, что вы делаете, лучшее, что мы можем сделать, чтобы решить это по умолчанию либо edu(X) или rich(X) истина: предполагается

edu(X) :- 
    member(X). 
rich(X) :- 
    member(X), \+ edu(X). 

Теперь все, чтобы быть образованным, если мы явно не заявят об ином. Вы можете сделать то же самое, что и по умолчанию, если вы предпочитаете. За исключением дополнительной информации, это лучшее, что вы можете сделать.

-1

Может быть, вы хотите написать:

member(X) :- edu(X) ; rich(X) 

Если кто-то образованный, богатый или обоих, является членом клуба.

+1

akshar100 хочет «если X является членом клуба, тогда X является богатым или образованным». То, что у вас есть, - это обратное. – nedned

1

В качестве примечания: идея использования дизъюнкции в головах положений привело к дизъюнктивной логики программирования, смотри, например, «Основы дизъюнктивный логического программирования» Хорхе Лобо, Джек Минкер, Аркота Rajaseka. edu(X);rich(X) :- member(X). будет действительным дизъюнктивным пунктом. Связанная с этим тема, дизъюнктивный Datalog, была изучена Николаей Леоне, Джеральдом Пфейфером и Вольфгангом Фабером в проекте DLV: http://www.dbai.tuwien.ac.at/proj/dlv/