相关疑难解决方法(0)

归因变量:库接口/实现/可移植性

当我撇了一些最近相关的问题,我偶然发现这个答案通过@mat质疑如何在Prolog中表示定向循环图,可直接通往邻居verticies.

到目前为止,我在Prolog中对属性变量的个人经验非常有限.但@mat给出的用例激发了我的兴趣.所以我尝试用它来回答另一个问题,用约束逻辑编程排序列表.

首先,好消息:我第一次使用归因变量就像我想要的那样.

然后,不是那么好的消息:当我通过回答发布时,我意识到在Prolog中有几个API和属性变量的实现.

我觉得我在这里过头了......特别是我想知道以下内容:

  • 什么API广泛使用?到目前为止,我发现了两个:SICStus和SWI.
  • 不同的属性变量实现提供哪些功能?同样的?或者一个包含另一个?
  • 语义上有差异吗?
  • 实际实施怎么样?有些比其他人更有效吗?
  • 可以(或是)使用属性变量进行可移植性问题吗?

很多问号,这里......请分享你的经验/立场?先感谢您!


编辑2015-04-22

这是上面提到的答案的代码片段:

init_att_var(X,Z) :-
    put_attr(Z,value,X).

get_att_value(Var,Value) :-
    get_attr(Var,value,Value).
Run Code Online (Sandbox Code Playgroud)

到目前为止,我"只"使用put_attr/3get_attr/3,但是 - 根据SICStus Prolog文档中的属性变量--- SICStus提供put_attr/2get_attr/2.

因此,即使是非常浅的用例也 需要一些仿真层(一种方式或另一种方式).

prolog

43
推荐指数
4
解决办法
740
查看次数

如何验证涉及dif/2约束的交换性?

围绕dif/2约束存在很多炒作,特别是作为对(\ =)/ 2和(\ ==)/ 2的一些非声明性的拯救.这种非声明性通常被描述为非单调性,并给出了非交际性的​​例子.

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

我进行了交换性测试,我想探究两种变体给出相同的结果:

?- A, B.
-- versus --
?- B, A.
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您正在测试产生约束的情况,call_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)).
Run Code Online (Sandbox Code Playgroud)

任何想法如何进行?

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

我正在使用交换性测试作为一种工具来找出有关dif/2约束相等的方法.然后,可以在更传统的测试用例中将此等式用作验证点.

prolog clp prolog-dif

7
推荐指数
1
解决办法
79
查看次数

标签 统计

prolog ×2

clp ×1

prolog-dif ×1