2009-09-15 3 views
0

Я пытаюсь работать на домашнее задание на основе старой песни, I'm my own grandpa.Как мне заказать эти правила Prolog, чтобы я мог запускать свою программу?

Итак, я начал определение правил для того, кто был сын, дочь, отец, отец _in _law и др.

Однако, что-то должно быть неправильным с заказом моих правил/факты, потому что каждый раз, когда я загрузить его я получаю следующие ошибки:

GNU Prolog 1.3.1
Даниэль Диас Copyright (C) 1999-2009
Daniel Diaz | ? - [дедушка]. составление /home/nfs/student/USER/cs4700/grandpa.pl
для байт-кода ...
/home/nfs/student/USER/cs4700/grandpa.pl:119: предупреждения: несоприкасающееся сказуемое ребенка/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:120: предупреждения: несоприкасающийся предикат ребенка/2 - пункт проигнорирован
/дома/Nfs/студент/USER/cs4700/дедушки .pl: 121: предупреждение: недопустимый предикат ребенок/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:122: предупреждение: диск ontiguous предикат ребенка/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:123: предупреждения: несоприкасающийся предикат ребенка/2 - пункт проигнорирован
/дома/NFS/студент/USER /cs4700/grandpa.pl:124: предупреждение: несоприкасающийся предикат ребенок/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:125: предупреждения: несоприкасающийся сказуемое сын/2 - статья проигнорирована
/home/nfs/student/USER/cs4700/grandpa.pl:126: предупреждение: несмежный сын-предикат/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:127: предупреждения: несоприкасающийся сказуемое сын/2 - оговорка игнорировали
/home/nfs/student/USER/cs4700/grandpa.pl:128: предупреждение: несоприкасающийся сказуемое сын/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:129: предупреждение: несоприкасающийся сказуемое сын/2 - пункт проигнорирован
/главная/NFS/student/USER/cs4700/grandpa.pl: 130: предупреждение: недопустимый предикат дочь/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa .pl: 131: предупреждение: несоприкасающееся сказуемое замужем/2 - пункт проигнорирован
/home/nfs/student/USER/cs4700/grandpa.pl:132: предупреждения: несоприкасающаяся предикатные женат/2 - пункт проигнорирован
/home/nfs/student/USER/cs4700/grandpa.pl:133: предупреждение: недопустимый предикат женат/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa.пли: 134: предупреждение: несоприкасающееся сказуемое замужем/2 - пункт проигнорирован
/home/nfs/student/USER/cs4700/grandpa.pl:135: предупреждения: несоприкасающийся предикат son_in_law/2 - пункт игнорируется
/главная/NFS/студент/USER/cs4700/grandpa.pl: 136: предупреждение: несоприкасающийся предикат father_in_law/2 - оговорка игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:137: предупреждение: несмежный предикат отец/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:138: предупреждение: недопустимый преди Cate отца/2 - пункт проигнорирован
/home/nfs/student/USER/cs4700/grandpa.pl:139: предупреждения: несоприкасающееся сказуемое отца/2 - пункт проигнорирован
/главный/NFS/студент/USER/cs4700/grandpa.pl: 140: предупреждения: несоприкасающееся сказуемое мать/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:141: предупреждение: несоприкасающееся сказуемое мать/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:142: предупреждение: недопустимый предикат мать/2 - статья игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:143: предупреждения: несоприкасающийся предикат step_mother/2 - оговорка игнорировали
/home/nfs/student/USER/cs4700/grandpa.pl:144: предупреждение: несоприкасающийся предикат brother_in_law/2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:145: предупреждения: несоприкасающийся предикат brother_in_law/2 - пункт проигнорирован
/главная/NFS/student/USER/cs4700/grandpa.pl: 146: предупреждение: недопустимый предикат дядя/2 - статья игнорируется
/home/nfs/studen т/USER/cs4700/grandpa.pl: 147: предупреждение: несоприкасающийся предикат step_daughter/2 - пункт проигнорирован
/home/nfs/student/USER/cs4700/grandpa.pl скомпилирован, 149 линий чтения - 8389 байт написано 44 мс

И мой код до сих пор:

child(X,Y):- 
    son(Y,X). 

child(X,Y):- 
    daughter(Y,X). 

parent(X,Y):- 
    father(X,Y). 

parent(X,Y):- 
    mother(X,Y). 

son(X,Y):- 
    child(X,Y), 
    male(X). 

daughter(X,Y):- 
    child(X,Y), 
    female(X). 

son_in_law(X,Y):- 
    child(X,Z), 
    not(child(X,Y)), 
    married(Z,Y), 
    male(X). 

step_daughter(X,Y):- 
    child(X,Z), 
    married(Z,Y), 
    not(child(X,Y)), 
    female(X). 

brother(X,Y):- 
    sibling(X,Y), 
    male(X). 

brother_in_law(X,Y):- 
    parent(Z,X), 
    parent(Z,Y), 
    not(sibling(X,Y)), 
    male(X). 

sibling(X,Y):- 
    parent(Z,X), 
    parent(Z,Y). 

sister(X,Y):- 
    sibling(X,Y), 
    female(X). 

father(X,Y):- 
    parent(X,Y), 
    male(X). 

father_in_law(X,Y):- 
    child(X,Z), 
    married(Y,Z), 
    not(child(X,Y)), 
    male(X). 

mother(X,Y):- 
    parent(X,Y), 
    female(X). 

step_parent(X,Y):- 
    married(X,Z), 
    parent(Z,Y), 
    not(parent(X,Y)). 

step_father(X,Y):- 
    step_parent(X,Y), 
    male(X). 

step_mother(X,Y):- 
    step_parent(X,Y), 
    female(X). 

grandparent(X,Y):- 
    parent(X,Z), 
    parent(Z,Y). 

grandmother(X,Y):- 
    grandparent(X,Y), 
    female(X). 

grandfather(X,Y):- 
    grandparent(X,Y), 
    male(X). 

grandchild(X,Y):- 
    child(X,Z), 
    child(Z,Y). 

married(X,Y):- 
    wife(X,Y), 
    female(X). 

married(X,Y):- 
    husband(X,Y), 
    male(X). 

uncle(X,Y):- 
    sibling(X,Z), 
    parent(Z,Y), 
    male(X). 

aunt(X,Y):- 
    sibling(X,Z), 
    parent(Z,Y), 
    female(X). 

male(i). 
male(f). 
male(s1). 
male(s2). 
female(w). 
female(d). 
child(i,f). 
child(s1,w). 
child(s1,i). 
child(s2,d). 
child(s2,f). 
child(d,w). 
son(i,f). 
son(s1,w). 
son(s1,i). 
son(s2,d). 
son(s2,f). 
daughter(d,w). 
married(i,w). 
married(w,i). 
married(f,d). 
married(d,f). 
son_in_law(f,i). 
father_in_law(i,f). 
father(f,i). 
father(i,s1). 
father(f,s2). 
mother(w,s1). 
mother(w,d). 
mother(d,s2). 
step_mother(d,i). 
brother_in_law(f,s1). 
brother_in_law(s1,f). 
uncle(s1,i). 
step_daughter(d,i). 

Я очень новой для Prolog, так что я, вероятно, просто сделать некоторую фундаментальную ошибку. Может ли кто-нибудь помочь мне в правильном направлении указать эти ошибки?

+0

Цель этой функции - предупредить вас, если вы случайно используете имя предиката более одного раза. – starblue

ответ

2

Это было давно, так как я использовал Пролог, но я нашел this. И из этого я заключаю, что вам либо нужно сначала использовать несговорную вещь, либо вам нужно сгруппировать все ваши правила вместе (т. Е. Иметь все с ребенком в одном месте, т. Е. Смешивать ваши правила и факты). Пример:

ребенок (X, Y): - сын (Y, X).

ребенок (X, Y): - дочь (Y, X).

ребенок (i, f).

ребенок (s1, w).

ребенок (s1, i).

ребенок (s2, d).

ребенок (s2, f).

ребенок (d, w).

1

http://www.gprolog.org/manual/gprolog.html#htoc50 С поставить это в верхней части кода:

discontiguous([child, son, daughter, married, etc]) 

Таким образом, вы можете отключить это предупреждение. У вас будет немного удовольствия, выкапывая выход из рекурсии и проблем с переполнением стека, но это часть удовольствия программирования!

p.s.- «директива» является немного более формальным, чем «штуковина», но мне это нравится :-)

1

Вы можете реорганизовать правила или использовать несмежные директиву, как намекал выше.

В качестве альтернативы, и это будет иметь смысл в отношении использования программы, вы можете объявить факты, связанные с повествованием песни, как динамические. Установлены правила производства, связанные с сыном, дочерей и т. Д. (Даже если вопрос о замужестве (X, Y) горячо обсуждается ;-)), в соответствии с которым необходимо подтвердить факты песни.

Другое дело: если вы не отлаживаете или проверяете разумность своих правил, вам не нужно описывать все факты, только из текста. Например: «У меня родился сын [из w]», вы даете сыну (s1, i) и [подразумевается песней] son ​​(s1, w), но вы можете позволить прологу вывести, что мужчина (s1) или ребенок (s1 , i), если это даже полезно для его утверждений.

Удачи!

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

  • Нет связанных вопросов^_^