Binding Prolog中的绑定变量
我在Prolog程序中遇到了以下问题。 该问题的数学公式如下: 设纠缠=形式纠缠(Symbol、Index、PosX、PosY)的结构集,其中Symbol是字符,Index是整数,PosX和PosY变量(绑定或未绑定)。 对于纠缠中的所有纠缠(Symbol、Index、PosX、PosY),当两个变量中的一个为PosX或PosY绑定,另一个为未绑定时,将未绑定变量绑定到Symbol 然后,让RemEntanglements=至少有一个PosX和PosY绑定的纠缠中的所有纠缠(符号、索引、PosX、PosY) 问题:给定设定的纠缠度,剩余的纠缠度(重纠缠度)是什么 我的代码没有按预期运行。你能给我一个提示,我应该改变什么吗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
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也是单态变量。非常感谢!我对芬德尔的工作方式一无所知。再次感谢!