【问题标题】:How to validate commutativity involving the dif/2 constraint?如何验证涉及 dif/2 约束的交换性?
【发布时间】:2016-06-27 22:55:58
【问题描述】:

围绕 dif/2 约束有很多炒作,尤其是作为 (\=)/2 和 (\==)/2 的一些非声明性的补救措施。这种非声明性通常被描述为非单调性,并给出了非交际性的​​例子。

但是,测试涉及 dif/2 的测试用例是否可交换的方法是什么。这是我想要做的元解释:

我做了一个交换性测试,我想探究这两个变体 给出相同的结果:

?- A, B.
-- versus --
?- B, A.

因此,通常您可以使用 (==)/2 内置谓词检查单调性,如果它归结为检查交换性。由于此谓词遵循实例化变量。

但是,如果您正在测试产生约束的案例,请调用_with_residue/2 还不够,还需要约束相等。哪个行 很棘手,如下例所示:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam

?- dif(f(X,X),f(a(U,g(T)),a(g(Z),U))), X=a(g(Z),U).
X = a(g(Z), U),
dif(f(a(g(Z), U), U, Z, U, T), f(a(U, g(T)), g(Z), T, g(Z), Z)).

?- X=a(g(Z),U), dif(f(X,X),f(a(U,g(T)),a(g(Z),U))).
X = a(g(Z), U),
dif(f(U, T), f(g(Z), Z)).

任何想法如何进行?

免责声明,这是一个陷阱:
我不认可交换性测试是一种好的测试方法,您可以在其中将好的和坏的谓词与规范分开。因为通常好谓词和坏谓词都可能没有交换性问题。

我使用交换性测试作为一种工具来了解 dif/2 约束相等的方法。然后可以在更传统的测试用例中将这种相等性用作验证点。

【问题讨论】:

    标签: prolog prolog-dif clp


    【解决方案1】:

    有几种方法。在这种情况下,最简单的方法可能是简单地重新发布收集到的剩余约束。

    在这个例子中,我们得到:

    ?- X = a(g(Z), U), 差异(f(a(g(Z),U),U,Z,U,T),f(a(U,g(T)),g(Z),T,g(Z),Z)) . X = a(g(Z), U), 差异(f(U,T),f(g(Z),Z))

    目标现在简单多了!

    您可以使用copy_term/3call_residue_vars/2 收集剩余目标。

    【讨论】:

    • 但是我也可以使用 call_residue_vars/2 自动重新发布。我没有尝试。而这可能只是账单的一半。如果它们更简单,你能以某种方式比较约束吗? (简单的不需要看起来相等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2020-10-18
    • 2012-08-17
    • 2012-05-08
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多