Порядок неизвестных в программировании логики ограничений 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 действительных чисел существует множество возможных решений уравнений и неравенств.

Другие вопросы по тегам