Вы не можете объединить несколько голов. Если вы хотите, чтобы edu(X)
и rich(X)
были истинными, когда member(X)
истинно, вы должны определить их отдельно («каждый член этого клуба образован» и «каждый член этого клуба богат»):
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
. Обратное верно для Боба. С Чарли мы определили оба факта, так что оба верны. Но как насчет Дэйва? И edu(dave)
, и rich(dave)
относятся к другому, создавая бесконечную рекурсию. Без каких-либо дополнительных знаний о том, что вы делаете, лучшее, что мы можем сделать, чтобы решить эту проблему, это установить по умолчанию либо edu(X)
, либо rich(X)
в true:
edu(X) :-
member(X).
rich(X) :-
member(X), \+ edu(X).
Теперь предполагается, что каждый человек образован, если мы прямо не заявим об обратном. Вы можете сделать то же самое по умолчанию для богатых, если вы предпочитаете. Если не считать дополнительной информации, это лучшее, что вы можете сделать.