2

如果我可以用它们的所有基于整数的算术,我的一些 Prolog 程序可能会受益颇多 (is)/2

所以我想要权力......用 ......所以我可以X is 10^3用clpfd-y代替:)

考虑以下五个支持的 Prolog 处理器:

  • GNU 序言1.4.4

    ?- X #= 10^3。
    未捕获的异常:error(type_error(fd_evaluable,(^)/2),(#=)/2)
    
    ?- X #= 10**3。
    X = 1000。
    
  • SWI-Prolog 7.3.14

    ?- 使用模块(库(clpfd))。%自动加载更棒
    真的。
    
    ?- X #= 10^3。
    X = 1000。
    
    ?- X #= 10**3。
    错误:域错误:预期为“clpfd_expression”,发现“10**3”
    
  • B-Prolog 8.1

    ?- X #= 10^3。
    X #= 10^3。
    *** 错误(非法数组访问,10^3)
    
    ?- X #= 10**3。
    X = 1000。
    
  • SICStus Prolog 4.3.2

    ?- 使用模块(库(clpfd))。
    真的。
    
    ?- X #= 10^3。
    !(^)/2 中存在错误
    !约束用户:wi(^)/2 不存在
    !目标:10^3
    
    ?- X #= 10**3。
    !用户存在错误:(**)/2
    !约束用户:(**)/2 不存在
    !目标:10**3
    

请提供想法/提示/建议。我能做些什么?也许使用一些兼容层?

先感谢您!

4

2 回答 2

2

快速破解救援?

警告:前方有大量的矫枉过正,但是......它甚至有用吗?它是便携式的吗?

让我们来看看!

  • SWI-Prolog 7.3.14

    • 使用

      ?- 使用模块(库(clpq))。
      真的。
      
      ?- clpq:{X = 10^3},整数(X)。
      X = 1000。% <== 成功!
      
    • 使用

      ?- 使用模块(库(clpr))。
      真的。
      
      ?- clpr:{X = 10^3},整数(X)。
      错误的。
      
  • SICStus Prolog 4.3.2

    • 使用

      ?- 使用模块(库(clpq))。
      真的。
      
      ?- clpq:{X = 10^3},整数(X)。
      错误的。
      
    • 使用

      ?- 使用模块(库(clpr))。
      真的。
      
      ?- clpr:{X = 10^3},整数(X)。
      错误的。
      

1X成功,3X失败... 工作,嗯,有点... 再说一次,我想不是这样。

于 2015-12-25T06:44:44.253 回答
0

您可以使用常量表达式:

?- X is 10^3.
X = 1000.

由于corr2 ,它应该在符合 ISO 标准的序言中工作。

它还将在 CLP(FD) 内部传播,就好像它是 X #= 10^3:

?- Y #= X+1, X is 10^3.
Y = 1001
X = 1000
于 2018-10-19T18:20:52.610 回答