Порядок неизвестных в программировании логики ограничений Prolog (clpr) - PullRequest
0 голосов
/ 26 августа 2018

У меня есть:

:-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 ]

0 голосов
/ 29 августа 2018

Лучше с ограничениями на конечные домены, используя этот модуль:

:-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
0 голосов
/ 27 августа 2018

Возможно, слабость используемого CLP (R) в том, что квадратичный регистр работает не так хорошо.После Y = Z очевидно, что X = Y ** 2, а затем с X = 9 и Y> 0 вы должны легко получить Y = 3. Какой CLP (R) вы используете?

CLP (R) должен не только поддерживать линейные равенства и неравенства.Используя, например, алгоритм Базиса Грёбнера, CLP (R) может сделать больше, даже алгебраически.Некоторые системы компьютерной алгебры могут сделать это легко.

Так что я думаю, это не проблема Пролога как такового, а скорее библиотеки.Строго говоря, CLP (X) указывает только на область X. Для области R действительных чисел существует множество возможных решений уравнений и неравенств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...