【问题标题】:How do I need to order these Prolog rules so I can run my program?我如何需要订购这些 Prolog 规则才能运行我的程序?
【发布时间】:2009-09-15 03:42:10
【问题描述】:

我正在尝试根据老歌 I'm my own grandpa. 完成家庭作业

所以,我已经开始为儿子、女儿、父亲、父亲_in_law 等定义规则。

但是,我的规则/事实的顺序一定有问题,因为每次加载时都会出现以下错误:

GNU Prolog 1.3.1
作者 Daniel Diaz 版权所有 (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: 警告:不连续谓词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: 警告:不连续的谓词 女儿/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: 警告:不连续的谓词 父亲法律/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).

我对 prolog 很陌生,所以我可能只是犯了一些根本性的错误。有人可以帮我指出有关这些错误的正确方向吗?

【问题讨论】:

  • 此功能的目的是在您不小心多次使用谓词名称时发出警告。

标签: prolog


【解决方案1】:

我已经很久没有使用 Prolog,但我找到了this。由此我得出的结论是,您要么需要首先使用不连续的事物,要么需要将所有规则组合在一起(即,将所有内容与孩子放在一个地方,即混合您的规则和事实)。示例:

孩子(X,Y):- 儿子(Y,X)。

孩子(X,Y):- 女儿(Y,X)。

孩子(i,f)。

孩子(s1,w)。

孩子(s1,i)。

孩子(s2,d)。

孩子(s2,f)。

孩子(d,w)。

【讨论】:

    【解决方案2】:

    来自http://www.gprolog.org/manual/gprolog.html#htoc50 将其放在代码的顶部:

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

    因此您可以取消此警告。解决递归和堆栈溢出问题会很有趣,但这是编程乐趣的一部分!

    p.s.- 'directive' 比 'thingy' 更正式一点,但我喜欢它 :-)

    【讨论】:

      【解决方案3】:

      您可以按照上面的提示重新组织规则或使用不连续指令。

      或者,这对于程序的使用来说是有意义的,您可以将与歌曲叙述相关的事实声明为动态的。建立了与儿子、女儿等相关的制作规则(即使已婚(X,Y)的问题引起了激烈的争论;-)),因此需要断言歌曲的事实。

      另一件事:除非您正在调试/检查规则的合理性,否则您不需要拼出所有事实,只需要从歌词中说出这些。例如:“I had a baby son [from w]”给你儿子(s1,i)和[歌曲暗示]儿子(s1,w),但你可以让prolog推断出男性(s1)或孩子(s1 , i),如果这对其断言有用的话。

      玩得开心!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 2019-09-11
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        相关资源
        最近更新 更多