Порядок неизвестных в программировании логики ограничений Prolog (clpr)
Я имею:
:-use_module(library(clpr)).
comp(X, Y, Z):-
{X = Y * Z, Y = Z, Y > 0, Z > 0}.
Который с запросом:
?-comp(X,3,Z).
Урожайность:
X = 9.0,
Z = 3.0
как и ожидалось. Но почему нет
comp(9,Y,Z).
также дать мне значения для Y и Z? Вместо этого я получаю:
{Z>0.0,Y=Z,9-Y*Z=0.0},
{9-Y*Z=0.0},
{9-Y*Z=0.0}
Спасибо!
2 ответа
Лучше с ограничениями на конечные домены, используя этот модуль:
:-use_module(library(clpfd)).
comp(X, Y, Z):-
X #= Y * Z, Y #= Z, Y #> 0, Z #> 0.
С
comp(9,Y,Z).
Я получил:
Y = Z, Z = 3
Возможно, слабость используемого CLP(R) в том, что квадратичный случай не работает так хорошо. После того, как Y = Z, очевидно, что X = Y**2, а затем с X = 9 и Y > 0, вы должны легко получить Y = 3. Какой CLP(R) вы используете?
CLP(R) должен не только поддерживать линейные равенства и неравенства. Используя, например, алгоритм Базиса Грёбнера, CLP(R) может сделать больше, даже алгебраически. Некоторые системы компьютерной алгебры могут сделать это легко.
Так что я думаю, это не проблема Пролога как такового, а скорее библиотеки. Строго говоря, CLP(X) указывает только на область X. Для области R действительных чисел существует множество возможных решений уравнений и неравенств.