【问题标题】:Relying on rule order依靠规则秩序
【发布时间】:2012-12-07 16:00:42
【问题描述】:

为了计算两个相同长度的列表之间的汉明距离,我使用foldl(hamm, A, B, 0, R). 和hamm/4 的定义:

hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.

第一条规则的删减防止了不必要的回溯。然而,第二条规则可以写成不同的:

hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.

和hamm2/4 与foldl/5 一起使用或对于A 和B 都接地的查询仍然是正确的。

那么,是否有充分的理由偏爱一个而不是另一个?还是有理由保持规则的顺序或改变它们?

我知道查询

hamm(a, B, 0, 1).

是假的,而

hamm2(a, B, 0, 1).

是真的,但我不能完全确定哪一个更有意义。 . .

【问题讨论】:

    标签: prolog meta-predicate


    【解决方案1】:

    OP 实现了两个累加器式谓词来计算汉明距离(hamm/4 和 hamm2/4),但不确定哪一个更有意义。

    让我们阅读使 OP 感到困惑的查询:“是否存在 X 使得距离 (a,X) 为 1?”。以下是 Prolog 给出的“答案”:

    ?- hamm(a,X,0,1). 
    false.                          % wrong: should succeed conditionally
    ?- hamm2(a,X,0,1).              % wrong: should succeed, but not unconditionally
    true.
    

    从逻辑的角度来看,两个实现在上述测试中都表现不佳。让我们为坚定性做一些测试:

    ?- hamm(a,X,0,1),X=a.           % right
    false.
    ?- hamm(a,X,0,1),X=b.           % wrong: should succeed as distance(a,b) is 1
    false.
    
    ?- hamm2(a,X,0,1),X=a.          % wrong: should fail as distance(a,a) is 0
    X = a.
    ?- hamm2(a,X,0,1),X=b.          % right 
    X = b.
    

    请注意,在之前的查询中,hamm/4 正确地失败了,而 hamm2/4 错误地成功了,反之亦然。 所以两者都是半对/半错,而都不是 坚定不移。


    可以做什么?

    基于this answer中@false提供的if_/3和(=)/3,我为谓词hamm3/4实现了以下纯代码:

    :- use_module(library(clpfd)).
    
    hamm3(A,B,V0,V) :-
       if_(A = B, V0 = V, V #= V0+1).
    

    现在让我们使用hamm3/4 重复上述查询:

    ?- hamm3(a,X,0,1). 
    dif(X,a).
    ?- hamm3(a,X,0,1),X=a.
    false.
    ?- hamm3(a,X,0,1),X=b.
    X = b.
    

    成功了!最后,让我们问最通用的查询,看看hamm3/4的整个解决方案集:

    ?- hamm3(A,B,N0,N).
    A = B,    N0 = N ;
    dif(A,B), N0+1 #= N.
    

    【讨论】:

      【解决方案2】:

      您已经发现了这些定义之间的差异:除了效率之外,您应该确定自己的要求。你打算在你的数据结构中接受变量吗?这种编程风格引入了一些高级的 Prolog 特性(不完整的数据结构)。

      无论如何,我认为第一种形式更准确(不太确定,我会说坚定不移地采用 4° 论点)

      ?- hamm(a, B, 0, 1).
      false.
      
      ?- hamm(a, B, 0, 0).
      B = a.
      

      而hamm2是

      ?- hamm2(a, B, 0, 1).
      true.
      
      ?- hamm2(a, B, 0, 0).
      B = a.
      

      【讨论】:

      • 你可以争论,对于hamm2(a, B, 0, 1),是的,B 与 A 不同,所以这两个元素应该增加汉明距离......但正如我所说,我也不能完全决定什么时候这才有意义。
      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多