как запустить приостановленные цели в прологе с ограничениями - PullRequest
1 голос
/ 11 февраля 2012

Я пытаюсь решить конкретную проблему с помощью решателей ограничений прологов, и я застрял: 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 Ответ

1 голос
/ 11 февраля 2012

Я думаю, что вы имеете в виду что-то вроде:

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

...