2012-02-11 3 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 конкретный код (Еогеасп-петля, которая может быть переведена на рекурсивный хелперов предиката, конечно, и библиотека IC).

Также обратите внимание, что call(Eq0) и написание только Lhs #= Rhs должно иметь такой же эффект (afaik). Но когда переменные в Lhs #= Rhs являются решающими переменными, это, кажется, не так, по крайней мере, я столкнулся с такой проблемой несколько месяцев назад, используя lib(cplex).

+0

спасибо за фрагмент. Я не понял эту часть кода: Eq0 = (Lhs # = Rhs) Как это работает? Пожалуйста, направляйте меня на подходящие материалы, доступные в Интернете, чтобы я мог больше узнать о таком кодировании. Спасибо. – kallakafar

+1

@kallakafar: если вы знаете, что переменная не может иметь значение 0, вы можете установить домен соответственно 'Vars :: [1..999]' и удалить цикл foreach. Строка 'Eq0 = (Lhs # = Rhs)' означает, что переменная 'Eq0' привязана к цели' (Lhs # = Rhs) ', но цель не выполняется. Он выполняется только в следующей строке 'call (Eq0)'. Проблема с написанием «Lhs # = Rhs» заключается в том, что с помощью библиотеки ic допускаются только переменные, а не сложные термины. В вашем случае термин «Lhs» будет термином, поэтому вам нужно будет обернуть его в 'eval/1':' eval (Lhs) # = Rhs'. – twinterer

+0

@kallakafar: документацию по ECLiPSe можно найти здесь: http://www.eclipseclp.org/doc/userman/umsroot.html и здесь: http://www.eclipseclp.org/doc/libman/libman. HTML. Однако вы должны были получить оба руководства с вашей установкой ECLiPSe. Затем есть курс электронного обучения Хельмута Симониса: 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

 Смежные вопросы

  • Нет связанных вопросов^_^