[英]Prolog CLP order of operations?
嗨,希望有人能帮助我。 我只是想知道下面的代码是否足以设置12 x 12的矩阵,并假设'constrain(M)'调用规则下方定义的所有正确约束,并标记每行? 目前这是失败的,我已经跟踪了约束,所以我知道它们都可以工作,但是不知道是否是因为我在主谓词之外调用它们?
matrix(M) :-
M = [R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12],
R1 = [A,B,C,D,E,F,G,H,I,J,K,L],
R2 = [A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2],
R3 = [A3,B3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3],
R4 = [A4,B4,C4,D4,E4,F4,G4,H4,I4,J4,K4,L4],
R5 = [A5,B5,C5,D5,E5,F5,G5,H5,I5,J5,K5,L5],
R6 = [A6,B6,C6,D6,E6,F6,G6,H6,I6,J6,K6,L6],
R7 = [A7,B7,C7,D7,E7,F7,G7,H7,I7,J7,K7,L7],
R8 = [A8,B8,C8,D8,E8,F8,G8,H8,I8,J8,K8,L8],
R9 = [A9,B9,C9,D9,E9,F9,G9,H9,I9,J9,K9,L9],
R10 = [A10,B10,C10,D10,E10,F10,G10,H10,I10,J10,K10,L10],
R11 = [A11,B11,C11,D11,E11,F11,G11,H11,I11,J11,K11,L11],
R12 = [A12,B12,C12,D12,E12,F12,G12,H12,I12,J12,K12,L12],
constrain(M),
labeling([],R1),
labeling([],R2),
labeling([],R3),
labeling([],R4),
labeling([],R5),
labeling([],R6),
labeling([],R7),
labeling([],R8),
labeling([],R9),
labeling([],R10),
labeling([],R11),
labeling([],R12).
您应该始终将约束发布与实际搜索分开 ( labeling/2
)。
原因很明确:寻找具体的解决方案通常会非常昂贵。 另一方面,发布约束通常非常快。
如果像您的情况那样,这两个部分混合不干净,则在出现不可预料的问题(例如未终止)时,您将无法轻易分辨出哪一部分是由谁负责。
在您的情况下,您需要在主谓词中改善的唯一事情是强制执行约束发布和搜索之间的分隔。
导致意外失败的错误很可能包含在您未在此处发布的规则之一中。 您可以通过系统地替换为true
的目标来找出失败所涉及的规则。 因此,无需进行跟踪:您可以通过这种方式声明性地调试CLP(FD)程序。
编辑 :这里是有关发布约束与搜索具体解决方案之间分离的更多信息。 正如GUPU中介绍的那样 ,我们将使用核心关系的概念,它具有以下特性:
_
结尾。 labeling/2
。 搜索部分通常由label/1
或labeling/2
。
假设您有一个谓词将这两个方面混合在一起,例如在当前情况下:
matrix(M) :- constraints_hold(M), ... relate M to variables Vs ... labeling(Strategy, Vs).
显然,由于上述原因,我们希望从此谓词中删除 labeling/2
的调用。 当然,正如您所观察到的,我们仍然希望以某种方式访问应该标记的变量 。
我们这样做如下:
我们为核心关系引入了一个新的参数 ,以传递需要标记的有限域变量列表。
按照约定,我们通过在谓词名称后加上下划线 ( _
)来反映附加参数。
因此,我们获得以下核心关系:
matrix_(M, Vs) :- constraints_hold(M), ... relate M to variables Vs ...
唯一缺少的部分(您尚未完成,但无论如何都应完成 )是说明目标对象(在本例中为matrix )与有限域变量之间的关系。 这是我要做的简单练习。 提示: append/2
。
完成所有这些操作后,您可以通过在单个查询或谓词中组合核心关系和labeling/2
来解决整个任务:
?- matrix_(M, Vs), labeling(Strategy, Vs).
请注意,核心关系和搜索之间是分开的:
在判断有关CLP(FD)约束的任何文本的质量时,请以对这一重要分隔的介绍和解释为指标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.