Ваша первая проблема заключается в том, что 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.
Как видите, это, вероятно, станет утомительным, но это сработает.Если вы хотите получить более полную поддержку для комплексных чисел вручную, вам следует подумать о том, чтобы сделать метаинтерпретатора.