Определить оператора в прологе - PullRequest
0 голосов
/ 25 мая 2018

Я делаю много прологических упражнений, чтобы улучшить свои логические навыки.Но я застрял с запросом упражнения.

Что мне нужно сделать, так это определить оператор i таким образом, что: если пользователь вводит комплексное число с этимсинтаксис через приглашение (поэтому я использую оператор чтения (X))

(4+ i 7) - (2+ i 3).

я получаю в результате

2+ i 4

Я понял, как определить оператор в Прологе,я изучил оператор op , но я не знаю, как на самом деле происходит операция вычитания

1 Ответ

0 голосов
/ 25 мая 2018

Ваша первая проблема заключается в том, что xfx определяет бинарный оператор, а вы хотите унарный оператор, поэтому вам нужно объявление, подобное этому:

:- op(600, xf, i).

Ваша вторая проблема заключается в том, что нет никаких обстоятельствв котором ввод арифметических выражений в запросе Prolog приведет к тому, что что-то вроде сокращения произойдет автоматически.См .:

?- 3 + 4 * 7.
ERROR: Undefined procedure: (+)/2 (DWIM could not correct goal)

?- X = 3 + 4 * 7.
X = 3+4*7.

Чтобы оценить арифметику, вы должны использовать оператор is/2:

?- X is 3 + 4 * 7.
X = 31.

Попробуйте представить is/2 как еще один предикат, связывая числовое значение с выражением.В ISO Prolog нет способа изменить поведение is/2, поэтому вам придется создать собственный предикат оценки и использовать его:

eval((A + B i) + (C + D i), E + F i) :- 
    E is A + C, 
    F is B + D.

Как только вы это сделаете, вы можете использоватьэто обычный способ:

?- eval((3 + 4 i) + (7 + 8 i), X).
X = 10+12 i.

Как видите, это, вероятно, станет утомительным, но это сработает.Если вы хотите получить более полную поддержку для комплексных чисел вручную, вам следует подумать о том, чтобы сделать метаинтерпретатора.

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