Как определить неравенство в арифметическом выражении, заданном запросом пролога? - PullRequest
0 голосов
/ 13 февраля 2012

Я работаю над прологом и столкнулся с этим сценарием - В моем запросе я передаю что-то вроде этого:

?- query( 2*X + 3*Y >= 3*Z )

Теперь я хотел бы, чтобы программа пролога захватила выражение неравенства, чтобы у меня было указанное выше неравенство в переменных, как показано ниже:

переменная 'Lhs' будет иметь 2*X + 3*Y переменная 'Rhs' будет иметь 3*Z Теперь я хочу, чтобы неравенство также было где-то назначено (в переменной с именем Opr ??), чтобы сказать что-то вроде Lhs Opr Rhs означало бы то же самое, что сказать "2*X + 3*Y >= 3*Z" ..

Это общая форма сценария, над которым я работаю. Я почему-то хочу, чтобы выявленное «неравенство» было идентифицировано, чтобы я мог использовать его позже в своем коде.

Я работаю над Eclipse-CLP с библиотекой IC.

Ответы [ 3 ]

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

Вы можете сделать это с любой системой prolog, используя оператор univ / 2 :

parse_ops(Expr, Lhs, Rhs, Op):-
  Expr =.. [Op, Lhs, Rhs].

?- parse_ops(2*X + 3*Y >= 3*Z, Lhs, Rhs, Op).
Lhs = 2*X+3*Y,
Rhs = 3*Z,
Op = (>=).
2 голосов
/ 13 февраля 2012

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

Eq =.. [Op,Lhs,Rhs],

Это работает в обоих направлениях.

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

Это должно быть в состоянии просто сделать:

parse_query(LHS >= RHS, LHS, RHS).

?- parse_query(2*X + 3*Y >= 3*Z, LHS, RHS).
LHS=2*X + 3*Y 
RHS=3*Z

Здесь вам нужно иметь дело с порядком операций, которые Parser использует при чтении вашего запроса.Взгляните на оператор op / 3 для eclipse-clp и документ оператора op / 3 для swi-prolog .Обратите внимание, что номер приоритета для неравенств выше, чем операторов.Это означает, что при анализе запроса (2 * X + 3 * Y> = 3 * Z) оператор> = становится функтором.Попробуйте использовать предикат отображения, чтобы прояснить это.

?- display(2*X + 3*Y >= 3*Z).
>=(+(*(2,X), *(3,Y)), *(3,Z))
...