2012-02-11 24 views
1

我试图用prologs约束求解器来解决特定的问题,我坚持:d 的我的问题,需要一个更普遍的版本是这样的:如何运行在序言暂停目标与约束

:- lib(ic).:- lib(ic). 
solve([A1*X+B1*Y=C1, A2*X+B2*Y=C2]):- 
X::[0..999], 
Y::[0..999], 
X #\= 0, 
Y #\= 0, 

A1*X+B1*Y#=C1, % line1 
A2*X+B2*Y#=C2. % line2 

而这是查询/目标我使用:

solve([2*X+3*Y=5, 3*X+2*Y=5]). 

,程序会计算X和Y的值(在这种情况下,X = 1,Y = 1在溶液中)。 我在想什么,如果在目标/查询参数的数量可能会有所不同..在这种情况下,我的序言程序需要有一个动态暂停的目标,以取代行%line1和%line2注释。

问题是,我如何让这些表达式延迟..?我不想在问题中硬编码,并认为只有两个表达式将通过目标传递。

希望问题是清楚的。 谢谢。

回答

1

我想你的意思是这样的:

:- lib(ic). 

solve([]). 
solve([Eq | Eqs]) :- 
     term_variables(Eq, Vars), 
     Vars :: [0..999], 
     (foreach(Var, Vars) do Var #\= 0), 
     Eq = (Lhs = Rhs), 
     Eq0 = (Lhs #= Rhs), 
     call(Eq0), 
     solve(Eqs). 

注意,这是ECLiPSe-CLP特定代码(在foreach循环可能被转换为一个递归帮手谓语,当然,和IC库)。

另请注意,call(Eq0)和只写Lhs #= Rhs应具有相同的效果(afaik)。但是当Lhs #= Rhs中的变量是求解变量时,似乎并非如此,至少我在几个月前使用lib(cplex)时遇到过这样的问题。

+0

感谢您的片段。我不明白这部分代码: Eq0 =(Lhs#= Rhs) 这是如何工作的?请指导我在线提供合适的材料,以便我可以阅读关于此类编码的更多信息。谢谢。 – kallakafar 2012-02-11 16:32:41

+1

@kallakafar:如果你知道变量的值不能为0,你可以相应地设置域'Vars :: [1..999]'并放弃'foreach'循环。 'Eq0 =(Lhs#= Rhs)'这一行意味着变量'Eq0'与目标'(Lhs#= Rhs)'绑定,但目标没有执行。它只在下一行调用(Eq0)'中执行。只编写'Lhs#= Rhs'的问题是,对于ic库,只允许变量,而不是复杂的术语。在你的情况下,'Lhs'将是一个术语,所以你需要将它包装在'eval/1'中:'eval(Lhs)#= Rhs'。 – twinterer 2012-02-13 08:01:18

+0

@kallakafar:ECLiPSe的文档可以在这里找到:http://www.eclipseclp.org/doc/userman/umsroot.html和这里:http://www.eclipseclp.org/doc/libman/libman。 HTML。不过,您应该已经收到了ECLiPSe安装手册。然后是Helmut Simonis的电子学习课程:http://4c.ucc.ie/~hsimonis/ELearning/index.htm和ECLiPSe教程介绍:http://www.eclipseclp.org/doc/tutorial/index。 HTML。最后,考虑在用户邮件列表上询问ECLiPSe的具体问题:https://lists.sourceforge.net/lists/listinfo/eclipse-clp-users – twinterer 2012-02-13 08:06:25