2013-04-23 2 views
1

Я получаю два сообщения об ошибке при компиляции этого:Пролог Family Tree Ошибки компиляции

"Clauses of (-)/1 are not together in source-file" and 
"Singleton variables: [X]" 

... эти два являются примерами ошибок, я получаю ...

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

male(X). 
female(X). 
parent(X,Y). 
father(X,Y):- male(X), parent(X,Y). 
mother(X,Y):- female(X), parent(X,Y). 
descendant(X,Y):- parent(Y,X). 
sibling(X,Y):- descendant(X,Z), descendant(Y,Z). 
brother(X,Y):- male(X), sibling(X,Y). 
sister(X,Y):- female(X), sibling(X,Y). 
grandparent(X,Y):- parent(X,Z), parent(Z,Y). 
paternalgrandparent(X,Y):- father(X,Z), father(Z,Y). 
ancestor(X,Y):- parent(X,Y). 
ancestor(X,Y):- ancestor(X,Z), parent(Z,Y). 
male(edward). 
male(sean). 
male(kevin). 
female(vicky). 
male(malcolm). 
male(claude). 
male(matthew). 
female(stephania). 
male(kurt). 
male(david). 
male(mark). 
male(raymond). 
female(therese). 
female(nadine). 
female(nathalie). 
male(richard). 
female(mary). 
male(john). 
female(lilian). 
female(inez). 
male(william). 
female(rose). 
male(richie). 
female(alice). 
brother(edward,vicky). 
brother(kevin,sean). 
brother(sean,vicky). 
sister(vicky,edward). 
brother(malcolm,claude). 
brother(claude,malcolm). 
brother(matthew,stephania). 
brother(kurt,matthew). 
sister(stephania,kurt). 
brother(david,mark). 
brother(mark,david). 
sister(therese,nadine). 
sister(nadine,therese). 
sister(lilian,inez). 
sister(inez,lilian). 
father(david,edward). 
mother(therese,edward). 
father(mark,malcolm). 
mother(nathalie,malcolm). 
father(raymond,matthew). 
mother(nadine,matthew). 
father(richard,david). 
mother(mary,david). 
father(john,therese). 
mother(lilian,therese). 
paternalgrandparent(richard,edward). 
grandparent(mary,edward). 
grandparent(lilian,edward). 
grandparent(john,edward). 
paternalgrandparent(richard,malcolm). 
grandparent(mary,malcolm). 
grandparent(lilian,matthew). 
grandparent(john,matthew). 
father(william,richard). 
mother(rose,richard). 
paternalgrandparent(william,david). 
grandparent(rose,david). 
father(richie,william). 
mother(alice,william). 
paternalgrandparent(richie,richard). 
grandparent(alice,richard). 
ancestor(richie,william). 
ancestor(alice,william). 
ancestor(william,richard). 
ancestor(rose,richard). 
ancestor(richard,david). 
ancestor(mary,david). 
ancestor(david,edward). 
ancestor(therese,edward). 
ancestor(lilian,therese). 
ancestor(john,therese). 
ancestor(lilian,nadine). 
ancestor(john,nadine). 
ancestor(richard,mark). 
ancestor(mary,mark). 
+0

Самый простой способ форматирования вашей программы в Stack Overflow - это выбрать части, которые вы хотите отформатировать, и нажать кнопку фигурных скобок '{}' на панели инструментов редактора вверху. – dasblinkenlight

+0

спасибо, ребята, ваши ответы действительно помогли мне, но у меня появилась другая проблема ... Я продолжаю создавать запросы, но даже для ложных утверждений я получаю «истинное» возвращение ...даже с атомами, которые не существуют (задал запрос «предк (лев, эдвард)) и получил истинную« ... любую идею, почему это происходит? –

+0

Если это что-то вроде ответов на yahoo, я предпочел бы подождать, пока это идет на голосование, так как оба ответа помогли мне. Кроме того, следующий вопрос касался этой программы, а не другой, поэтому я подумал, что было бы неплохо получить вопросы, относящиеся к этой программе, рассмотренной на той же странице ... –

ответ

1

В «положения не вместе» является простейшей ошибки исправить: просто переставить факты вашей программы таким образом, что все факты, с тем же именем (например, male/1, female/1 и т.д.) появляются вместе в источнике вашей программы.

«одноэлементный переменные» ошибки поступают из этих линий:

male(X). 
female(X). 
parent(X,Y). 

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

male(_). 

бы утверждать, что кто-нибудь мужчина, и вы не хотите, чтобы это произошло. Вы должны просто удалить эти правила, чтобы избежать ошибок singleton.

Однако самая большая проблема с вашей программой заключается в том, что вы пытаетесь определить факты для вещей, которые вы уже определили с помощью правил. Факты, которые вам нужны, - male/1, female/1 и parent/2. Все остальное можно правильно вывести с помощью правил.

0

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

Так, например

male(edward). 
male(sean). 
male(kevin). 
female(vicky). 
male(malcolm). 

не хорошо. Причина этого в том, что вы распространяете определение мужчины вокруг, код становится совершенно нечитаемым.

Второе сообщение, что если вы используете переменную в голове, вы должны использовать ее в теле.

Так, например

male(X). 

не хорошо. Вы можете написать

male(_). 

Опять же, очень часто одноэлементные переменные вызывают ошибки в том, что вы пытаетесь писать, так что лучше использовать _, чтобы сделать их использование явно.

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