代码之家  ›  专栏  ›  技术社区  ›  lambda.xy.x

析取算子的等价性及若干规则的定义

  •  0
  • lambda.xy.x  · 技术社区  · 7 年前

    我只是偶然发现了 ;/2 在 SWI Prolog Manual 其中规定:

    The `or' predicate is defined as:
    
    Goal1 ; _Goal2 :- Goal1.
    _Goal1 ; Goal2 :- Goal2.
    

    那不意味着 ;/2个 行为就像我们编写了自己的helper谓词,它由两个规则组成?我已经记住了 ;/2个 是一个不纯的结构(但我有可能把它与IF,否则)混合起来,但是这个定义是纯的(虽然是元逻辑的)。

    语义学 ;/2个 在ISO标准第7.8.6段中进行了定义,但这是在当前状态的操作、选择点等方面进行的。

    SWI手册中的定义是否等同于ISO定义?如果没有,你知道他们有什么不同吗?

    0 回复  |  直到 7 年前
        1
  •  4
  •   false    7 年前

    这难道不意味着;/2的行为就像我们编写了由两个规则组成的helper谓词一样吗?

    不,术语对身体的转换是有区别的。

    但首先 (;)/2 定义在 二者都 7.8.6(析取)和7.8.8(如果是,则为其他)-正如7.8.6中的第一句所示。周围的圆括号 ; 见7.1.6.6中的注释。

    所以第一个问题是,如果您看到 ( G_0 ; H_0 ) 在你的程序中。这不取决于调用时出现的实例化 (;)/2个 但这取决于术语到实体转换期间的实例化(7.6.2)。

    ?- G_0 = ( true -> X = si ), ( G_0 ; X = nisi ).
       G_0 =  (true->si=si),
       X = si
    ;  G_0 =  (true->nisi=si),
       X = nisi.
    
    ?- G_0 = ( true -> X = si ), call( ( G_0 ; X = nisi ) ).
       G_0 =  (true->si=si),
       X = si.
    

    在第一个查询项中,在析取中替换 G_0 通过 call(G_0) 因此

    ( call( ( true -> X = si ) ) ; X = nisi ) )
    

    将被处决。

    在第二个查询中,有两个术语到正文的转换,一个用于整个查询,另一个用于显式查询 call/1 ,但两者都保持原样,因此

    call( ( true -> X = si ; X = nisi ) )
    

    将被执行,而其他案件则被排除在外。

    由于术语到实体的转换,进一步的区别在于由于变形的实体导致的切割和错误。

        2
  •  3
  •   repeat    7 年前

    据我所知,定义

    p(X) :- G1 ; G2 .
    

    与定义

    p(X) :- G1 .
    p(X) :- G2 .
    

    是的,你正在混合 ; 有点关联但完全不同 _ -> _ ; _ .

    推荐文章