0

我正在尝试使用 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 注释的行。

问题是,我如何使这些表达延迟..?我不想在问题中对这些进行硬编码,并认为只有两个表达式会通过目标..

希望问题很清楚。谢谢。

4

1 回答 1

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).

于 2012-02-11T13:41:50.930 回答