【问题标题】:Prolog, using expressionsProlog,使用表达式
【发布时间】:2011-05-30 03:59:36
【问题描述】:

我正在努力学习 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)).

我在pseudoemacs窗口中按下compile 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))

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您已使用(==)/2 代替(=:=)/2,后者将其参数作为算术表达式求值。

    您可以使用(X,Y,Z),但它不是三元组,例如哈斯克尔。看到这个:

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

    【讨论】:

    • 我应该用什么代替三元组?
    • @Oxinabox:如果您的所有向量都是 3d,则使用列表或仿函数 v/3
    【解决方案2】:

    Prolog 中的表达式仅表示句法术语树。要计算表达式,您需要 X is Y 将 Y 计算为算术表达式并将结果与​​ X 统一。或者,您可以使用 X =:= Y 将 X 和 Y 作为算术表达式计算,然后统一结果。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 2021-04-28
      • 2014-05-23
      • 2012-10-29
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多