1

我在 Prolog 程序中遇到以下问题。问题的数学公式如下:

让 Entanglements = entanglement(Symbol, Index, PosX, PosY) 形式的结构集,其中 Symbol 是一个字符,Index 是一个整数,PosX 和 PosY 变量(绑定或未绑定)。对于 Entanglements 中的所有 entanglement(Symbol, Index, PosX, PosY),将两个变量 PosX 或 PosY 之一绑定,另一个未绑定,将未绑定的变量绑定到 Symbol。

之后,让 RemEntanglements = all entanglement(Symbol, Index, PosX, PosY) in Entanglements,至少有一个 PosX 和 PosY 绑定。

问题:给定集合的纠缠,剩余的纠缠(RemEntanglements)是什么?

我的代码没有按预期运行。你能提示我应该改变什么吗?

function(Entanglements, RemEntanglements) :-
findall(entanglement(Symbol, Index, PosX, PosY),
    (member(entanglement(Symbol, Index, PosX, PosY), Entanglements),
    (var(PosX), nonvar(PosY), PosX = Symbol;
    var(PosY), nonvar(PosX), PosY = Symbol)),
    Changed),
findall(entanglement(Symbol1, Index1, PosX1, PosY1),
    (member(entanglement(Symbol1, Index1, PosX1, PosY1),Entanglements),
    (var(PosX1);
    var(PosY1))),
    RemEntanglements).

测试查询:

test(RemEntanglements) :-
    function([entanglement('0',2,'X',P3),
            entanglement('X',3,P3,P1), entanglement('0',4,P6,P7)],
            RemEntanglements).

这个查询应该如下工作: 1) 将 P3 绑定到 '0',假设 entanglement('0',2,'X',P3) 有一个绑定变量和一个未绑定变量

2) RemEntanglements = [entanglement('X',3,'0',P1), entanglement('0',4,P6,P7)],假设 P3 已经绑定到 '0' 符号,但其他的仍然未绑定。

我得到的答案:

[entanglement('0', 2, 'X', _G11664), entanglement('X', 3, _G11655, _G11656), entanglement('X', 3, _G11647, _G11648), entanglement('0', 4, _G11639, _G11640), entanglement('0', 4, _G11631, _G11632)]

先感谢您!

4

2 回答 2

1

现在的写法,你至少应该摆脱单例变量。它们几乎总是指向谓词逻辑中的错误。一方面,您在第一个findall(to Changed) 中绑定变量,然后在第二个中使用原始列表findall,这显然不是您的意图。

但是,您的测试中的单例变量应该是未绑定的,您可以使用下划线开始它们的名称以使警告静音。

于 2013-05-16T13:23:10.290 回答
1

我认为您使用了错误的谓词: findall(Template,Goal,List) 它是一个列表生成器,并且抽象地工作 - 在目标中实例化模板,然后在列表中复制模板。然后 Goal 中的任何绑定都将在执行之间撤消。

然后我会这样写

function(Entanglements, RemEntanglements) :-
    maplist(instance, Entanglements),
    include(one_bound, Entanglements, RemEntanglements).

instance(entanglement(Symbol, _Index, PosX, PosY)) :-
    (   ( var(PosX), nonvar(PosY) )
    ->  PosX = Symbol
    ;   ( var(PosY), nonvar(PosX) )
    ->  PosY = Symbol
    ;   true
    ).

one_bound(entanglement(_Symbol, _Index, PosX, PosY)) :-
    nonvar(PosX) ; nonvar(PosY).

test(RemEntanglements) :-
    function([  entanglement('0',2,'X',P3),
            entanglement('X',3, P3,_),
            entanglement('0',4, _,_)],
         RemEntanglements).

产生

?- test(L).
L = [entanglement('0', 2, 'X', '0'), entanglement('X', 3, '0', 'X')].
于 2013-05-16T13:43:54.803 回答