2015-12-25 89 views
1

我的一些Prolog程序可以利用有点有点,如果我可以替换所有(is)/2为基础的整数算术的对应。SICStus Prolog 4.3.2:clpfd没有权力?

所以我想力量...与... ,所以我可以用的东西clpfd-Y :)

考虑以下五个Prolog的处理器,支持更换X is 10^3

  • 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 
    

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

预先感谢您!

+1

更难处理的数字范围差异!参见例如Markus Triska [论文](http://www.metalevel.at/drt.pdf) – CapelliC

+0

@CapelliC。我没有得到那个......你指的是什么?请指出我的论文中的某些页面......或者您可能指的是以下限制之一?多个求解器如何能够优雅地进行交互?或者像'length/2'这样的内置插件如何不能处理FD变量,因为实现还没有赶上? – repeat

+0

@CapelliC。快乐的圣诞节,顺便说一句!上升和发光的主已经来到了地球...... – repeat

回答

1

快速入侵?

警告:大规模的矫枉过正,但...它甚至可以工作吗?它是否便携?

让我们来看看吧!

  • 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失败...作品,好吧,那种...然后,我想不是这样。

+2

'clpr'和'clpq'按预期工作:'10^3'的浮点数'1000.0';和'clpq'的'rat(1000,1)'。 – false

+0

我担心clpfd不兼容 - 开箱即用,至少 - 用clpq/clpr。所以你的解决方案对我来说似乎很不好。也许'简单'一词重写,与goal_expansion,可以帮助,并最终语法宏基于: - if(swi)或: - if(sictus)... – CapelliC

+0

@false。这是一个期望的问题。所以(虽然这打破了我的破解),SWI中的clpq应该给'rat(1000,1)'而不是'1000'吗? – repeat

相关问题