Получить внутреннее / каноническое представление терминов в прологе - PullRequest
1 голос
/ 04 мая 2020

Я пишу программу, для которой мне нужны термины в их префиксной записи. Смысл в том, чтобы иметь возможность анализировать математические выражения с префиксной нотацией, сохраняя при этом правильный порядок операций. Затем я хочу сохранить результат в базе данных для последующего использования (используя assert), что включает перевод на другой язык, который использует префиксную нотацию. Все операторы Prolog имеют фиксированный приоритет, который я хочу использовать, поскольку я буду использовать все виды операторов (включая операторы clp).

Как и другие, мне нужно включить полные математические выражения, такие как как оператор равенства. Таким образом, я не могу рекурсивно использовать оператор Univ (= ..), потому что он не будет принимать операторы равенства et c. Или я могу как-то использовать = ..?

По сути, я хочу работать с внутренним представлением

N is 3*4+5   % just a random example

, которое будет

is(N,+(*(3,4),5))

Теперь я делаю знаю, что я могу использовать, write_canonical(N is 3*4+5), чтобы получить внутреннее представление, как показано выше.

Так есть ли способ каким-то образом получить внутреннее представление в виде термина, списка или чего-то еще. Можно ли связать вывод write_canonical с переменной?

Надеюсь, мой вопрос достаточно ясен.

1 Ответ

1 голос
/ 04 мая 2020

Термины Пролог могут быть обозначены как деревья . Но при написании термина способ отображения термина зависит от определенных операторов и параметров записи. Рассмотрим:

?- (N is 3*4+5) = is(N,+(*(3,4),5)).
true.

?- (N is 3*4+5) = is(Variable, Expression).
N = Variable,
Expression = 3*4+5.

?- 3*4+5 = +(*(3,4),5).
true.

Т.е. операторы синтактичны c сахар. Они не меняют то, как представлены термины, только то, как они отображаются .

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