【问题标题】:Prolog compound termsProlog 复合词
【发布时间】:2014-10-09 23:48:33
【问题描述】:

我讨厌在这里问基本问题,但是,似乎很难找到关于 Prolog 的好的手册。

我有两个术语:

woman(alice).
woman(janice).

现在,我想制作以下复合词:

sisters(woman(X), woman(Y)).

当我运行查询 Sisters(X,Y) 时,我得到了这样的胡言乱语: X = 女人(_G2215), Y = 女人(_G2217)

其实,什么都满足。

sisters(woman(david), woman(xxxxxx))

也是如此。

为什么它不能按预期的方式工作?看来,prolog 从不查看前两个术语。

我知道我应该成功

sisters(X, Y) :- woman(X), woman(Y), X \= Y

但我想知道为什么第一种方法行不通。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    详细说明保罗的回答...

    您已确定以下事实:

    woman(alice).    % 'alice' is a woman
    woman(janice).   % 'janice' is a woman
    sisters(woman(X), woman(Y)).   % woman(X) is a sister of woman(Y) for ANY X and Y
    

    因此您可以看到,由于 Paulo 指出复合术语以及 Prolog 不递归查询它们的原因,您已经朝着您不打算的方向前进。在这种情况下,您已经陈述了一个事实,sisters(woman(X), woman(Y)) 有两个独立的、未实例化的变量。由于它们是变量,并且您没有任何 sisters/2 子句来限制它们的值,因此它们可以是任何值。

    所以对于下面的查询:

    sisters(X, Y).
    

    Prolog 查看您的事实和谓词以进行匹配并找到 sisters(woman(X), woman(Y))。因此,合乎逻辑的答案是:

    X = woman(_G2215)
    Y = woman(_G2217)
    

    这只是说XY 的这些值是正确的,其中_G2215_G2217 是任意变量。根据您所陈述的规则和事实,这些的任何价值都是真实的。特别是这意味着这是真的:

    sisters(woman(david), woman(xxxxxx))
    

    因为X 可能是davidY 可能是xxxxxx,这是真的,因为你的事实表明:

    sisters(woman(X), woman(Y)).
    

    你可以引入一条规则:

    sisters(woman(X), woman(Y)) :- woman(X), woman(Y), X \= Y.
    

    然后你会开始得到合理的查询答案,sisters(X, Y)

    X = woman(alice)
    Y = woman(janice)
    

    或者更简单地说,就像你有的那样:

    sisters(X, Y) :- woman(X), woman(Y), X \= Y.
    

    结果:

    X = alice
    Y = janice
    

    【讨论】:

      【解决方案2】:

      在子句的情况下:

      sisters(woman(X), woman(Y)).
      

      参数是术语women/1不是调用women/1谓词。请注意,Prolog 不是函数式语言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多