SICStus Prolog 4.3.2:clpfd没有力量?

时间:2015-12-25 05:37:02

标签: prolog portability clpfd sicstus-prolog

如果我可以用对象取代所有 (is)/2的整数算术,我的一些Prolog程序可以获得相当

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

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

  • GNU Prolog 1.4.4

    ?- X #= 10^3.
    uncaught exception: error(type_error(fd_evaluable,(^)/2),(#=)/2)
    
    ?- X #= 10**3.
    X = 1000.
    
  • SWI-Prolog 7.3.14

    ?- use_module(library(clpfd)).  % autoload would be even more awesome
    true.
    
    ?- X #= 10^3.
    X = 1000.
    
    ?- X #= 10**3.
    ERROR: Domain error: `clpfd_expression' expected, found `10**3'
    
  • B-Prolog 8.1

    ?- X #= 10^3.
    X #= 10^3.
    *** error(illegal_array_access,10^3)
    
    ?- X #= 10**3.
    X = 1000.
    
  • SICStus Prolog 4.3.2

    ?- use_module(library(clpfd)).
    true.
    
    ?- X #= 10^3.
    ! Existence error in (^)/2
    ! constraint user:wi(^)/2 does not exist
    ! goal:  10^3
    
    ?- X #= 10**3.
    ! Existence error in user:(**)/2
    ! constraint user:(**)/2 does not exist
    ! goal:  10**3
    

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

提前谢谢!

2 个答案:

答案 0 :(得分:3)

快速破解救援?

警告:未来大规模的过度杀伤,但......它甚至可以工作吗?它是便携式的吗?

让我们看看吧!

  • SWI-Prolog 7.3.14

    • 使用

      ?- use_module(library(clpq)).
      true.
      
      ?- clpq:{X = 10^3}, integer(X).
      X = 1000.                          % <== SUCCESS!
      
    • 使用

      ?- use_module(library(clpr)).
      true.
      
      ?- clpr:{X = 10^3}, integer(X).
      false.
      
  • SICStus Prolog 4.3.2

    • 使用

      ?- use_module(library(clpq)).
      true.
      
      ?- clpq:{X = 10^3}, integer(X).
      false.
      
    • 使用

      ?- use_module(library(clpr)).
      true.
      
      ?- clpr:{X = 10^3}, integer(X).
      false.
      

1X 成功, 3X 失败......工作,嗯,有点......再说一遍,我猜它是不是。

答案 1 :(得分: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