我在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)]
提前谢谢!
答案 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')].