LINUX.ORG.RU

Логическое программирование, теоретический аспект


0

0

Я тут универсальный язычок программирования разрабатываю.. Вернее, абстрактную машину. И пришел к выводу что одной из ее инструкций должно быть сгенерировать произвольный объект, удовлетворяющий заданным предикатам (ну или в более общей форме, фитнесс-функции). Предикаты задаются как обычные функции этой абстр. машины.

Возникает вопрос как компилятор все это будет реализовывать. То есть не прийдется ли ему во всех случаях, кроме заранее захардкоденных просто перебирать все счетное мн-во объектов в поисках подходящего. Хотелось бы как можно больше расширить ту область, в которой компилятор мог бы поступать умно.

Кто что знает почитать на эту тему? Правильно ли я понимаю что перед языками типа пролога стоит та же задача, и там можно почерпуть идей?

★★★★★

Абстрактная мойшина для Пролога давно уже разработана и обкатана, зовётся WAM. Лучше всего начать с ней знакомиться по сырцам gprolog-а.

vlugovsky
()
Ответ на: комментарий от anonymous

> Посмотри принципы организации Forth-машины и слова-генераторы в нём.

не.. в Форте этого точно нет.

Генерация произвольного объекта удовлетв. предикату требует от компилятора нехилого анализа этого предиката. Учитывая, что предикат может быть произвольным кодом..

Например этот предикат может потребовать решения уравнения.. То есть в общем случае, это эффективно компилироваться не будет.

Пример испольования такой штуки: флоатов в моей машине не будет. Они реализуются (в стандартной библ) как списки из пары-тройки целых, удовл. каким-то ограничениям. Операции с ними реализуются с помощью генерирования произв. объекта с подходящими свойствами. В зависимости от того какие флоаты программисту нужны (ieee-754 или грязные и быстрые) эти свойства (предикаты) разные. Компилятор должен суметь посмотреть на эти предикаты и понять, агабля, для этого списка целых можно использовать машинный флоат, а для этой операции машинную инструкцию.

Но, например, с появлением квантовых компов, инструкции с более широким набором предикатов смогут компилироваться эффективно:)

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> не.. в Форте этого точно нет.

Точно? :)

> Например этот предикат может потребовать решения уравнения..

А это не похоже ли на:


Haпpимep, генератор для определения констант выглядит так:             

 :  CONSTANT  CREATE  ,   (  cлoвo "," peзepвиpyeт 2 бaйтa   )                                   (  и клaдeт в ниx чиcлo из cтeкa   )                 DOES>             (  нa cтeкe aдpec этиx двyx бaйтoв )                        @   ;      (  знaчeниe пoмeщaeтcя в cтeк      )         

   B кaчecтвe yпpaжнeния paзбepитe ycтpoйcтвo гeнepaтopa одномepныx мaccивoв. Cлoвo "ARRAY"  бepeт   
   из cтeкa цeлoe чиcло n и резepвиpyeт в  кoдoфaйлe мecтo для n чиceл, cвязывaя c ними  следующее   
   зa "ARRAY" cлoвo  кaк имя этoгo  мaccивa. В дальнейшем  при выполнении имeни  мaccивa из  стека   
   бepeтся индeкc, проверяется его  принадлeжнocть диaпaзoнy oт 1  дo n и, ecли  все в порядке,  в   
   стек помещается адрес cooтвeтcтвyющeгo элeмeнтa мaccивa.            

   : ARRAY              ( в cтeкe лeжит чиcлo элeмeнтoв          )           CREATE  DUP  ,    ( этo чиcлo пoмeщaeтcя в пoлe пapaмeтpoв )               2*  ALLOT     ( зaxвaт мecтa для мaccивa               )             DOES>           ( пpи вызoвe в cтeкe лeжит индeкc        )                             ( и пoмeщaeтcя aдpec зaxвaчeннoй пaмяти  )             OVER 1 <                                                                 IF  ." ИHДEKC MEHЬШE 1"   2DROP                                     ELSE  2DUP  @  >        IF  ." ИHДEKC БOЛЬШE ЧEM HAДO" 2DROP                      ELSE  1+  SWAP  2*  +        THEN  THEN ;

anonymous
()
Ответ на: комментарий от anonymous

Опс... sorry

> не.. в Форте этого точно нет.

Точно? :)

> Например этот предикат может потребовать решения уравнения..

А это не похоже ли на:


Haпpимep, генератор для определения констант выглядит так:             

 :  CONSTANT  CREATE  ,   (  cлoвo "," peзepвиpyeт 2 бaйтa   )         
                          (  и клaдeт в ниx чиcлo из cтeкa   )         
        DOES>             (  нa cтeкe aдpec этиx двyx бaйтoв )         
               @   ;      (  знaчeниe пoмeщaeтcя в cтeк      )         

   B кaчecтвe yпpaжнeния paзбepитe ycтpoйcтвo гeнepaтopa одномepныx мaccивoв. Cлoвo "ARRAY"  бepeт   
   из cтeкa цeлoe чиcло n и резepвиpyeт в  кoдoфaйлe мecтo для n чиceл, cвязывaя c ними  следующее   
   зa "ARRAY" cлoвo  кaк имя этoгo  мaccивa. В дальнейшем  при выполнении имeни  мaccивa из  стека   
   бepeтся индeкc, проверяется его  принадлeжнocть диaпaзoнy oт 1  дo n и, ecли  все в порядке,  в   
   стек помещается адрес cooтвeтcтвyющeгo элeмeнтa мaccивa.            

: ARRAY              ( в cтeкe лeжит чиcлo элeмeнтoв          )        
   CREATE  DUP  ,    ( этo чиcлo пoмeщaeтcя в пoлe пapaмeтpoв )        
       2*  ALLOT     ( зaxвaт мecтa для мaccивa               )        
     DOES>           ( пpи вызoвe в cтeкe лeжит индeкc        )        
                     ( и пoмeщaeтcя aдpec зaxвaчeннoй пaмяти  )        
     OVER 1 <                                                          
       IF  ." ИHДEKC MEHЬШE 1"   2DROP                                 
    ELSE  2DUP  @  >        IF  ." ИHДEKC БOЛЬШE ЧEM HAДO" 2DROP       
               ELSE  1+  SWAP  2*  +        
               THEN
    THEN ;

anonymous
()
Ответ на: комментарий от dilmah

> Пример испольования такой штуки: флоатов в моей машине не будет. Они реализуются (в стандартной библ) как списки из пары-тройки целых, удовл. каким-то ограничениям. Операции с ними реализуются с помощью генерирования произв. объекта с подходящими свойствами. В зависимости от того какие флоаты программисту нужны (ieee-754 или грязные и быстрые) эти свойства (предикаты) разные. Компилятор должен суметь посмотреть на эти предикаты и понять, агабля, для этого списка целых можно использовать машинный флоат, а для этой операции машинную инструкцию.

А как тебе это: http://www.forth.org.ru/~day/float2111.rar

:-)

anonymous
()
Ответ на: комментарий от anonymous

ну вот смотри пример кода из этой ссылки:

CODE 1.E
       FLD1
       RET
END-CODE

это не то что нужно мне.  Мне нужно чтобы в компилятор был встроен
мойшенный анализатор пердикатов.  И чтобы программист (или
стандартная библ) просто использовал список из пары целых, навесил
на них кучу свойств которые ты от этого списка ожидаешь.  Компилятор
эти св-ва сам проанализировал и принял решение -- этот список
представляем в виде машинного флоата.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Обломайс, товарисч. Машина Уоррена - регистровая, а не стековая. Форт тут сильно не в тему. Оптимальнее WAM пока никто ничего не придумал.

vlugovsky
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.