ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Використання Prolog спільно з іншими ЯП
         

     

    Інформатика, програмування

    Використання Prolog спільно з іншими ЯП.

    Поняття Dll.

    Згадаймо процес програмування в DOS. Перетворення вихідного текстув машинний код містив у собі 2 процеси: компіляцію і лінковку. Під часлінковкі в код програми містилися не тільки оголошення функцій іпроцедур, а й їх повний код.

    У багатозадачному середовищі подібний підхід був би вельми марнотратний, такяк величезна кількість функцій, що відповідають за промальовування елементівпризначеного для користувача інтерфейсу, за звернення до системних ресурсів і т.п.дублювалися в кожній програмі. Для вирішення виниклої проблемибула запропонована концепція динамічного компонування (див. рис. 1).

    рис 1.

    DLL (бібліотека динамічної зв'язку) - файл, який виступає в якостіколективної бібліотеки предикатів, які можуть бути використаніодночасно в декількох додатках. Prolog здатний генерувати DLL,включати DLL статично і завантажувати динамічно.

    Виклик у програмі на VP процедур і функцій на інших мовах.

    Перед тим, як викликати процедури та функції на інших мовах їх потрібнооголосити як зовнішній предикат, згадавши, що він здійснюється на іншомумовою. При цьому необхідно знати кількість і порядок вхідних параметрів:

    GLOBAL PREDICATES procedure add (integer A, integer B, integer C) - (i, i, o) language pascal

    Зауваження: зверніть увагу, що в VP явно зазначається мова процедури

    Передача вхідних/вихідних параметрів і повернення значень.

    Розмір вхідних параметрів визначено однозначно і залежить тільки відоголошеного типу. Вихідний параметр - 32 бітний покажчик на областьпам'яті, де зберігається вихідна значення.

    Слід зазначити, що функції на Pascal не можуть повертати значення уформаті чисел з плаваючою точкою, а функції C - структури (але можуть,звичайно, повертати покажчики на них).

    Численні декларації.

    Предикат VP може мати різні комбінації вхідних/вихідних параметрів,і для кожної з них необхідна окрема процедура. Ідентифікатори,використовувані в Prolog повинні збігатися з ідентифікаторами в бібліотеці +суфікс _X, де X - ціле число (порядковий номер процедури, нумераціяпочинається з 0). Якщо існує тільки один варіант, то суфіксвідсутня. Розглянемо приклад:

    GLOBAL PREDICATES subtraction (integer, integer, integer) - (i, i, o), (i, o, i), (o, i, i),
    (i, i, i) language C change (integer, integer) - (i, o) language C

    GOAL subtraction (2,2, X), write ( "2-2 =", X ), nl, subtraction (2, Y, 5), write ( "2-5 =", Y), nl, subtraction (Z, 5,4), write ( "5-4 =", X), nl, subtraction (2,2,5), write ( "2-2 одно 5"), nl, change (5, Ch), write (Ch).

    Модуль, що пов'язується з цією програмою повинен містити процедури :

    subtraction_0 (int x, int y, int * z)

    (* z = xy;) subtraction_1 (int x, int * y, int z)

    (* y = xz;) subtraction_2 (int * x, int y, int z)

    (* x = yz;) subtraction_3 (int x, int y, int z)

    (if ((xy)! = z) RUN_Fail ();) change (int a, int * b)

    (* b = a;)

    Примітка : якщо процедура написана на мові C, то параметри заносяться встек у зворотному порядку (після повернення значень покажчик автоматичнокоректується VP), в іншому випадку, параметри заносяться в стек внормальному порядку (див. таблицю 1).

    Формати об'єктних файлів в Win32.

    Під Win32 використовується 2 формату об'єктних файлів: OMF (об'єктно -модульний формат - використовується, наприклад, Borland C + +) і COFF (Загальнийоб'єктно-файловий формат, використовується, наприклад, Visual C + +).

    1. При використанні файл у форматі OMF ім'я предиката має збігатися з ім'ям функції.

    2. При використанні файлу у форматі COFF, до імені предиката додається знак підкреслення, і після символу @ вказується кількість байт, доданих в стек (наприклад, якщо предикат name має 2 цілих аргументу, то він повинен бути оголошений як _name @ 8 (див. таблицю 1 )).

    Установка покажчика на стек.

    Існує два способи установки покажчика на стек: при оголошенніфункції і при її виклику. Так склалося, що Pascal встановлює покажчикпри оголошенні функції, а С - при виклику (див. таблицю 1).

    | | Конвертуючи | Порядок | Встановлює | Необхідність |
    | | Т імена в | аргументів | вказівник на | конвертіроват |
    | | Верхній | прямій. | стек при | ь імена в |
    | | Реєстр. | | Оголошення. | формат COFF. |
    | C | - | - | - | |
    | pascal | + | + | + | |
    | stdcall | | + | - | + |
    | syscall | | + | + | - |

    Таблиця 1: виклик модулів з VP.

    Неавтоматичне позначення зовнішніх предикатів.

    Ідентифікатор процедури або функції в VP не обов'язково має збігатисяз ідентифікатором в зовнішньому модулі. У цьому разі оголошення такогопредиката має вигляд:

    GLOBAL PREDICATES add (integer, integer, integer) - (i, o) language c as "_myadd @ 12"


    Еквівалентність типів.

    Більшість простих типів змінних в VP мають еквіваленти в іншихмови програмування, однак розмір зберігаються для них пам'яті можене збігатися (див. таблицю 2).

    | Тип змінної | Розмір (Win32). |
    | char, byte | 1 байт |
    | short, word | 2 байт |
    | long, dword | 4 байт |
    | unsigned, integer | 4 байт |
    | Real | 8 байт |
    | Ref | 4 байт |

    Таблиця 2: розмір змінних в VP.


    Обробка списків.

    Нижче наведено приклад програми, перетворюючої список в масив, і потімзнову повертає дані до списку.

    Програма ListToArray на мові С перетворить список цілих чисел вмасив, записує в стек елементи масиву і повертає кількістьелементів (масив і кількість елементів передаються в програму якпараметри).

    Перетворення списку проходить в 2 етапи:
    1. Проглядається список і стоїть кількість елементів у ньому.
    2. Цілі числа зі списку заносяться в масив, що складається з відомої кількості елементів.

    /* Program lstar_p.pro */

    project "lstar"

    global domains ilist = integer *

    global predicates inclist (ilist, ilist) - (i, o) language c

    goal inclist ([1,2,3,4,5,6,7 ], L), write (L).

    /* Program lstar_c.c */

    # define listfno 1
    # define nilfno 2 typedef unsigned char BYTE;

    void * MEM_AllocGStack (unsigned);

    typedef struct ilist (

    BYTE Functor; int Value; struct ilist * Next;
    ) INTLIST;

    int ListToArray (INTLIST * List, int ** ResultArray)
    (

    INTLIST * SaveList = List; int * Array, len; register int * ArrP; register int i;

    /* кількість елементів у списку */i = 0; while (List-> Functor == listfno) (i ++;

    List = List-> Next;

    ) len = i;

    Array = MEM_AllocGStack (i * sizeof (int ));

    ArrP = Array;

    /* переміщення елементів списку в масив */
    List = SaveList; while (i! = 0) (

    * ArrP + + = List-> Value;

    List = List-> Next; i -;
    )

    * ResultArray = Array; return (len);
    )

    void ArrayToList (register int * ArrP, register int n,

    register INTLIST ** ListPP)
    (while (n! = 0) (

    * ListPP = MEM_AllocGStack (sizeof (INTLIST ));

    (* ListPP) -> Functor = listfno;

    (* ListPP) -> Value = * ArrP ++;

    ListPP = & (* ListPP) -> Next; n -;

    )

    * ListPP = MEM_AllocGStack (sizeof ((* ListPP) -> Functor ));

    /* кінець списку */

    (* ListPP) -> Functor = nilfno;
    )

    void inclist (INTLIST * InList, INTLIST ** OutList)
    (register int * ArrP, i, len; int * Array;

    len = ListToArray (InList, & Array);

    ArrP = Array; for (i = 0; i

    + + * ArrP ++;

    ArrayToList (Array, len, OutList);
    )


    Виклик предикатів VP.

    VP здатний не тільки викликати предикати, але й надавати їх іншимпрограмами. Нижче наведений приклад виклику предиката prowin_msg з програмина С:

    /* Program hello_p.pro */

    global predicates char prowin_msg (string) - (i) language c hello_c - language c

    clauses prowin_msg (S, C): - write (S, "(press any key)"), readchar (C).

    goal prowin_msg ( "Hello from PDC Prolog"), hello_c.

    /* Program hello_c.c */

    char prowin_msg (char *);

    void hello_c ()
    (while (prowin_msg ( "Hello from C (press 'C') ")! = 'C')

    ;
    )

    2003 Pechenkin [email protected] www.cs.vsu.ru/ ~ pechenkin


         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status