Prolog中的绑定变量

时间:2013-05-16 10:58:44

标签: binding prolog

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

让纠缠=形式纠缠(符号,索引,PosX,PosY)的结构集,其中Symbol是字符,索引是整数,PosX和PosY变量(绑定或未绑定)。 对于纠缠中的所有纠缠(符号,索引,PosX,PosY),两个变量PosX或PosY中的一个绑定而另一个未绑定,将未绑定变量绑定到Symbol。

之后,让RemEntanglements =纠缠中的所有纠缠(符号,索引,PosX,PosY)至少有一个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',假设纠缠('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)]

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

然后我会以这种方式写作

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')].