Prolog,使用表达式

Lyn*_*ite 6 prolog

我正在尝试学习SWI prolog,但是当我相信它应该成功时,我的简单程序就失败了.

%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)).
Run Code Online (Sandbox Code Playgroud)

我在pseudoemacs窗口中按下编译缓冲区,输出为:

% [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))
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 7

您已使用它来(==)/2代替(=:=)/2其作为算术表达式计算其参数.

你可以使用(X,Y,Z),但它不像Haskell那样是三元组.看到这个:

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

?- (1,2,3) = (X,Y).
X = 1,
Y = (2,3).
Run Code Online (Sandbox Code Playgroud)

  • @Oxinabox:如果你的所有向量都是3d,要么使用列表,要么使用仿函数`v/3`. (2认同)

Raf*_*afe 6

Prolog中的表达式仅代表句法术语树.要评估一个表达式,您需要将X is YY作为算术表达式进行求值,并将结果与​​X统一.或者,您可以使用X =:= Y它来计算X和Y作为算术表达式,然后统一结果.

干杯!