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注释。
问题是,我如何让这些表达式延迟..?我不想在问题中硬编码,并认为只有两个表达式将通过目标传递。
希望问题是清楚的。 谢谢。
感谢您的片段。我不明白这部分代码: Eq0 =(Lhs#= Rhs) 这是如何工作的?请指导我在线提供合适的材料,以便我可以阅读关于此类编码的更多信息。谢谢。 – kallakafar 2012-02-11 16:32:41
@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
@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