Как мне заказать эти правила Пролога, чтобы я мог запустить свою программу? - PullRequest
0 голосов
/ 15 сентября 2009

Я пытаюсь выполнить домашнее задание на основе старой песни, Я - мой собственный дедушка.

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

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

GNU Prolog 1.3.1
Даниэль Диас Copyright (C) 1999-2009
Даниэль Диаз | ? - Дедушка. составление /home/nfs/student/USER/cs4700/grandpa.pl
для байтового кода ...
/home/nfs/student/USER/cs4700/grandpa.pl:119: предупреждение: несмежный предикат child / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:120: предупреждение: несмежный предикат child / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:121: предупреждение: несмежный предикат child / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:122: предупреждение: несмежный предикат child / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:123: предупреждение: несмежный предикат child / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:124: предупреждение: несмежный предикат child / 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 - пункт игнорируется
/home/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.pl:134: предупреждение: несмежный предикат женат / 2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:135: предупреждение: несмежный предикат son_in_law / 2 - пункт игнорируется
/home/nfs/student/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: предупреждение: несмежный предикат папа / 2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:139: предупреждение: несмежный предикат папа / 2 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:140: предупреждение: несмежный предикат mother / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:141: предупреждение: несмежный предикат mother / 2 - предложение игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:142: предупреждение: несмежный предикат mother / 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 - пункт игнорируется
/home/nfs/student/USER/cs4700/grandpa.pl:146: предупреждение: несмежный предикат дядя / 2 - предложение игнорируется
/home/nfs/student/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).

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

Ответы [ 3 ]

2 голосов
/ 15 сентября 2009

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

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

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

ребенок (я, е).

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

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

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

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

ребенок (д, ш).

1 голос
/ 15 сентября 2009

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

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

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

Веселись!

1 голос
/ 15 сентября 2009

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

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

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

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

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