Как выполнить оценку арифметического выражения в прологе?

Я пытаюсь решить арифметическое выражение в прологе (реализация - пролог затмения). Решаемое арифметическое выражение выглядит следующим образом:

A * (C + B * X) + D * X = E

X - это значение, которое нужно вычислить, а все остальные (A, B, C, D, E) - это числа.

Например: 5 * (3 + 2 * X) + 2 * X = 39, при вычислении следует присвоить X значение 2.

Запрос (цель), который будет введен в Пролог, будет иметь форму:

?- compute( 5*(3+2*X)+2*X = 39, Result).

«Результат» и значение «X» должны быть связаны (присвоены) вместе. Как мне написать программу пролога, чтобы сделать это ..?

Спасибо.


person kallakafar    schedule 09.02.2012    source источник


Ответы (1)


Я предполагаю, что вы используете fd, а не ic. Это немного упрощает.

:-lib(fd).

Далее, предполагая, что у вас есть только уравнения, а не неравенства, и только одна переменная X, вы можете сделать это в два этапа:

compute(L=R, X) :-
  term_variables(L, [X]),
  L #= R.

Сначала извлеките переменную из левой части, затем опубликуйте ограничение, которое вычисляет уравнение. Если уравнение верно, это создаст экземпляр вашей переменной.

Изменить

В библиотеке ic используйте eval(L)#=R.

person twinterer    schedule 09.02.2012
comment
Спасибо за фрагмент, я протестировал, и он сработал. Однако я новичок в прологе и не могу понять, как X вычисляет значение. Я предполагаю, что # = - это отложенное ограничение. Не могли бы вы рассказать мне, как вычисляется решение? Спасибо. - person kallakafar; 09.02.2012
comment
Да, #=/2 обозначает целочисленное ограничение. См. Раздел 3.1 в Руководстве по библиотеке ограничений ECLiPSe, в котором объясняется решатель ic. Что происходит внутри, так это то, что алгоритм распространения ограничения запускается, когда ограничение публикуется. Это обновляет домены переменных, которые связаны с ограничением, чтобы сделать их согласованными. В этом случае этого достаточно для получения решения. Программирование с ограничениями Marriott / Stuckey - хороший учебник, как и "Программирование логики ограничений Apt / Wallace с использованием Eclipse". - person twinterer; 09.02.2012
comment
Спасибо и за это направление, это действительно помогает! Спасибо. - person kallakafar; 09.02.2012