2015-12-25 10 views
1

Некоторые из моих программ на Прологе может получить прибыль довольно немного, если я мог бы заменить все(is)/2 -А целочисленной арифметику их коллегой.SICStus Prolog 4.3.2: clpfd не получил питания?

Так что я хочу власть ... с ... так что я могу заменить X is 10^3 с чем-то clpfd-у :)

Рассмотрим следующие пять процессоров 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 
    

Идеи/советы/консультации, пожалуйста. Что мне делать? Используйте некоторые совместимые уровни (ы) , возможно?

Спасибо заранее!

+1

Намного сложнее будет обрабатывать числовые различия в диапазоне! См., Например, Маркус Триска [тезисы] (http://www.metalevel.at/drt.pdf) – CapelliC

+0

@CapelliC. Я не понял ... Что именно вы имеете в виду? Пожалуйста, укажите мне какую-нибудь страницу в тезисе мата ... Или вы можете ссылаться на одно из следующих ограничений? Как несколько решателей могут взаимодействовать изящно? Или как встроенные элементы вроде 'length/2' не могут обрабатывать FD vars, потому что реализация еще не догнала? – repeat

+0

@CapelliC. Веселый X-mas, кстати! Восстание и блеск для господина приходят на Землю ... – repeat

ответ

1

Быстрый взлом на помощь?

Предупреждение: массовый перебор, но ... он даже работает? И он переносится?

Давайте проверим!

  • SWI-Пролог 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' работают как и ожидалось: float' 1000.0' для '10^3'; и 'крыса (1000,1)' для 'clpq'. – false

+0

Я боюсь, что clpfd не совместим - из коробки, по крайней мере - с clpq/clpr. Поэтому ваше решение кажется мне очень хриплым .... извините. Может быть, «простой» переписывание терминов с помощью функции goal_expansion может помочь и, в конечном счете, синтаксических макросов на основе: - if (swi) или: -if (sictus) ... – CapelliC

+0

@false. Это вопрос ожиданий. Итак, (в то время как это нарушает мой взлом), должен ли clpq в SWI скорее давать 'rat (1000,1)' вместо '1000' тоже? – repeat