Создание отложенного ограничения с использованием манипулятора термов единства в прологе - PullRequest
0 голосов
/ 13 февраля 2012

Это мое выражение арифметического неравенства в прологе:

2*X + 3*Y > 4*Z

Я использовал манипулятор термина «единство» так:

Expr =.. [Op, Lhs, Rhs]

И теперь у меня есть Lhs = 2*X + 3*Y, Rhs as 4*Z and Op as > Все хорошо до сих пор.

Я хочу построить отложенную цель, используя для этого выражения библиотеку IC в Eclipse Prolog.Например, я хочу, чтобы вновь созданная переменная присваивалась следующим образом:

Eq = (Lhs #Op Rhs)  %meaning, Eq = (2*X + 3*Y #> 4*Z)

Теперь, поскольку требуемое неравенство (в данном случае>) хранится в Op, хотя я использую Eq = (Lhs #Op Rhs), eclipse возвращаетошибка.

Как создать это отложенное ограничение, когда мой оператор должен быть взят из переменной Op?Спасибо.

1 Ответ

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

Вы можете использовать факты для определения отношений:

cstr(=,#=).

Или использовать concat_atom/2:

concat_atom([#,Op],CstrOp),

Например:

?- Eq = (X = 1),
   Eq =.. [Op, L, R],
   concat_atom([#, Op], CstrOp),
   Cstr =.. [CstrOp, L, R],
   call(Cstr).
Eq = 1 = 1
X = 1
Op = =
L = 1
R = 1
CstrOp = #=
Cstr = 1 #= 1
Yes (0.00s cpu)

Обратите внимание, что этоработает только для основных операторов равенства / неравенства.Вы не можете добавить # только к любому оператору и ожидать, что он будет работать как ограничение!

...