Binding Prolog中的绑定变量

Binding Prolog中的绑定变量,binding,prolog,Binding,Prolog,我在Prolog程序中遇到了以下问题。 该问题的数学公式如下: 设纠缠=形式纠缠(Symbol、Index、PosX、PosY)的结构集,其中Symbol是字符,Index是整数,PosX和PosY变量(绑定或未绑定)。 对于纠缠中的所有纠缠(Symbol、Index、PosX、PosY),当两个变量中的一个为PosX或PosY绑定,另一个为未绑定时,将未绑定变量绑定到Symbol 然后,让RemEntanglements=至少有一个PosX和PosY绑定的纠缠中的所有纠缠(符号、索引、PosX

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

设纠缠=形式纠缠(Symbol、Index、PosX、PosY)的结构集,其中Symbol是字符,Index是整数,PosX和PosY变量(绑定或未绑定)。 对于纠缠中的所有纠缠(Symbol、Index、PosX、PosY),当两个变量中的一个为PosX或PosY绑定,另一个为未绑定时,将未绑定变量绑定到Symbol

然后,让RemEntanglements=至少有一个PosX和PosY绑定的纠缠中的所有纠缠(符号、索引、PosX、PosY)

问题:给定设定的纠缠度,剩余的纠缠度(重纠缠度)是什么

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

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=
[纠缠('X',3,'0',P1),纠缠('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)]

提前谢谢你

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


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

我认为您使用了错误的谓词: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')].

你能在你的问题中明确说明问题是什么吗?你在编译时没有看到任何警告吗?另外,有一个ISO谓词
nonvar/1
,你肯定应该使用它,而不是
\+var(X)
给定集合纠缠度,计算集合重纠缠度,同时绑定变量PosX或PosY。不,我在编译时没有看到任何警告。事实上,关于更改为单例变量的说法是正确的。这个谓词是我编写的一个更大的谓词的一部分,其中更改的变量正在另一个谓词中使用,因此没有警告。似乎P3、P6和P7也是单态变量。非常感谢!我对芬德尔的工作方式一无所知。再次感谢!