0

昔の歌に基づいた宿題に取り組もうとしています、私は自分のおじいちゃんです。

そこで、息子、娘、父、父_in_law などのルールを定義することから始めました。

ただし、ルール/ファクトをロードするたびに次のエラーが発生するため、ルール/ファクトの順序に何か問題があるに違いありません。

GNU Prolog 1.3.1
Daniel Diaz 著作権 (C) 1999-2009
Daniel Diaz | ?- [おじいちゃん]。/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: 警告: 不連続な述語の子/2 - 節は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl:121: 警告: 不連続な述語の子/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: 警告: 不連続な述語 son/ 2 - 句は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl:126: 警告: 不連続な述語 son/2 - 句は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl:127: 警告:不連続な述語 son/2 - 節は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl:128: 警告: 不連続な述語 son/2 - 節は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl: 129: 警告: 不連続な述語 son/2 - 句は無視され
ます /home/nfs/student/USER/cs4700/grandpa.pl:130: 警告: 不連続な述語 daughter/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: 警告:不連続な述語married/2 - 句は無視され
ます /home/nfs/student/USER/cs4700/grandpa.pl:135: 警告: 不連続な述語 son_in_law/2 - 句は無視され
ます /home/nfs/student/USER/cs4700/grandpa.pl: 136: 警告: 不連続な述語の父の法律/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: 警告:不連続な述語母/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 - 句は無視されました
/home/nfs/student/USER/cs4700/grandpa.pl:146: 警告:不連続な述語 uncle/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).

私はプロローグに非常に慣れていないので、おそらく根本的な間違いを犯しています。これらのエラーに関して、誰かが私を正しい方向に向けるのを手伝ってもらえますか?

4

3 に答える 3

2

Prologを使うのは久しぶりでしたが、これを見つけまし。そして、それから、最初に不連続なものを使用するか、すべてのルールをグループ化する必要があると結論付けています(つまり、子を持つすべてのものを1か所にまとめる、つまりルールと事実を混ぜ合わせます)。例:

子(X,Y):- 息子(Y,X)。

子(X,Y):- 娘(Y,X)。

子(i、f)。

子(s1、w)。

子(s1,i)。

子 (s2、d)。

子(s2、f)。

子(d、w)。

于 2009-09-15T03:54:55.143 に答える
1

http://www.gprolog.org/manual/gprolog.html#htoc50から、これをコードの先頭に配置します。

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

したがって、この警告を抑制することができます。再帰とスタックオーバーフローの問題から抜け出すのは少し楽しいでしょうが、それはプログラミングの楽しみの一部です!

ps-'directive'は'thingy'よりも少しフォーマルですが、私はそれが好きです:-)

于 2009-09-15T04:33:17.093 に答える
1

上記のように、ルールを再編成するか、不連続なディレクティブを使用できます。

または、これはプログラムの使用に関して理にかなっていますが、歌の物語に関連する事実を動的であると宣言することもできます。息子、娘などに関連する制作規則が確立されているため (結婚 (X,Y) の問題が熱く議論されていても ;-) )、それによって歌の事実が主張される必要があります。

別のこと: ルールの健全性をデバッグ/チェックする場合を除き、すべての事実を綴る必要はなく、歌詞からこれらだけを示す必要があります。例: 「I had a baby son [from w]」は、son(s1, i) と [imlied by song] son(s1, w) を与えますが、prolog にその male(s1) または child(s1) を推測させることができます。 、i)、それがそのアサーションに役立つ場合。

楽しむ !

于 2009-09-15T04:59:55.107 に答える