Пролог, используя выражения - PullRequest
6 голосов
/ 30 мая 2011

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

%My code:
orthogonal((X1,Y1,Z1),(X2,Y2,Z2)) :- (X1*X2)+(Y1*Y2)+(Z1*Z2)==0.
integerVector((X,Y,Z)) :- integer(X),integer(Y),integer(Z).

?-orthogonal((1,0,0),(0,0,1)).

Я нажимаю кнопку Buffer для компиляции в окне псевдоемаков, и вывод:

% [PATH].pl compiled 0.00 sec, 136 bytes
ERROR: emacs_prolog_mode ->error_at_location: Argument 1 (int): `int' expected, found `@11470948?start'
ERROR: emacs_prolog_mode ->error_at_location: Argument 1 (int): `int' expected, found `@11470948?start'
Warning: [PATH]s.pl:5:
        Goal (directive) failed: user:orthogonal((1,0,0), (0,0,1))

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

Вы использовали (==)/2 вместо (=:=)/2, который оценивает свои аргументы как арифметические выражения.

Вы можете использовать (X,Y,Z), но это не тройка, как, например, в Haskell.Чтобы увидеть это:

?- write_canonical((1,2,3)).
','(1,','(2,3))

?- (1,2,3) = (X,Y).
X = 1,
Y = (2,3).
6 голосов
/ 30 мая 2011

Выражения в прологе просто представляют синтаксические деревья терминов.Для вычисления выражения вам нужно X is Y, которое оценивает Y как арифметическое выражение и объединяет результат с X. В качестве альтернативы вы можете использовать X =:= Y, который оценивает и X и Y как арифметические выражения, а затем объединяет результаты.

Ура! * * 1005

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