2011-05-30 11 views
5

estoy tratando de aprender SWI Prolog, pero mi programa simple falla cuando creo que debe tener éxito.Prolog, utilizando expresiones

%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)). 

prosigo compilar búfer en la ventana pseudoemacs y la salida es:

% [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)) 

Respuesta

6

Ha utilizado (==)/2 en lugar de (=:=)/2 que evalúa sus argumentos como expresiones aritméticas.

Puede utilizar (X,Y,Z), pero no es un triple como en el ejemplo Haskell. Para ver esto:

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

?- (1,2,3) = (X,Y). 
X = 1, 
Y = (2,3). 
+1

¿Qué debo usar en lugar de triples? –

+2

@Oxinabox: use listas, o un funtor 'v/3' si todos sus vectores son 3d. –

5

Las expresiones en Prolog simplemente representan árboles de términos sintácticos. Para evaluar una expresión que necesita para X is Y que evalúa Y como una expresión aritmética y unifica el resultado con X. Alternativamente, puede utilizar X =:= Y que evalúa tanto X e Y como expresiones aritméticas, a continuación, unifica los resultados.

¡Salud!