Вы не можете комбинировать несколько головок. Если вы хотите 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).
Теперь все, чтобы быть образованным, если мы явно не заявят об ином. Вы можете сделать то же самое, что и по умолчанию, если вы предпочитаете. За исключением дополнительной информации, это лучшее, что вы можете сделать.
akshar100 хочет «если X является членом клуба, тогда X является богатым или образованным». То, что у вас есть, - это обратное. – nedned