Использование 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=x-y;}
subtraction_1 (int x,
int *y, int z)
{*y=x-z;}
subtraction_2 (int *x, int y, int z)
{*x=y-z;}
subtraction_3 (int x,
int y, int z)
{if ((x-y)!=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 < len; 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
pechenkin@pochtamt
www.cs.vsu/~pechenkin
Другие работы по теме:
Логическая грамматика
Логические грамматики превратились с течением лет в инструментарий высокого уровня, и теперь они позволяют пользователю сконцентрироваться на лингвистических феноменах.
Математические модели
Выбор основного алгоритма решения задачи. Требования к функциональным характеристикам программы. Минимальные требования к составу и параметрам технических средств и к информационной и программной совместимости. Логические модели, блок-схемы алгоритмов.
Безъядерная Новая Зеландия
Безъя́дерная Но́вая Зела́ндия (англ. Nuclear-free New Zealand) — принцип внутренней и внешней политики Новой Зеландии, накладывающий полный запрет на использование ядерной энергии в стране, а равно запрет на постоянное или временное присутствие в стране ядерного оружия и ядерных энергетических установок.
Санчес, Рикардо
Рикардо Санчес (исп. Ricardo S. Sбnchez, 1953, Рио-Гранде, Техас, США) — генерал-лейтенант Армии США, командующий коалиционными войсками в Ираке с июня 2003 по июнь 2004 года.
Муса-бий
— бий Ногайской Орды. На политической арене обычно действовал вместе со своим братом Ямгурчи и Сибирским ханом Ибаком. В начале 1470-х годов сообща боролись за независимость против узбекского хана Шайх-Хайдара, сына Абу-л-Хайра, в 1470-71 их союзником был хан Золотой орды Ахмат. 6 января 1481 совместно с Ямгурчи и Ибаком напали с небольшим отрядом на стойбище хана Ахмата и убили его.
Европейский пикник
— демонстрация мира на австрийско-венгерской границе вблизи города Шопрон 19 августа 1989 года. С согласием обеих стран открыли пограничные ворота на старой Братиславской дороге между Санкт-Маргаретен (Бургенланд) и Шопронкёхида (Sopronkőhidal) символически на три часа. На этом же месте австрийский министр иностранных дел Алоиз Мок и его венгерский коллега Дьюла Хорн 27 июня 1989 совместно разрезали пограничный забор, чтобы подчеркнуть начатую Венгрией 2 мая 1989 года ликвидацию наблюдательных сооружений.
Викицитатник
Викицита́тник (англ. Wikiquote) — свободное собрание из цитат из высказываний известных личностей или героев художественных произведений, создаваемое читателями совместно. Этот сайт создан Фондом Викимедиа на движке MediaWiki.
COINTELPRO
КОИНТЕЛПРО unter Intel ligence gram, «контрразведывательная программа») — секретная программа Федерального бюро расследований по подавлению деятельности ряда политических и общественных организаций США. Официально действовала в 1956—1976 годах. В рамках программы сотрудники ФБР прослушивали телефонные переговоры, осуществляли различные провокации, совместно с полицией проводили незаконные аресты, распространяли дезинформацию.
Постановление ЦК КПСС и Совета Министров СССР
— нормативный документ, принимаемый совместно Центральным комитетом Коммунистической партии Советского Союза — высшим партийным органом в период между съездами КПСС, и Советом Министров СССР — высшим исполнительным и распорядительным органом государственной власти в СССР[1]. Данные постановления определяли различные стороны деятельности общества в СССР и являлись обязательными для исполнения всеми организациями и предприятиями.
Рудольф II герцог Австрии
Рудольф II (нем. Rudolf II; 1271—10 мая 1290) — герцог Австрии с 27 декабря 1282 совместно с Альбрехтом I по 1 июня 1283. Из династии Габсбургов. Рудольф II был младшим сыном германского короля Рудольфа I. В 1282 г. он вместе со своим старшим братом Альбрехтом I стал герцогом Австрии и Штирии, положив таким образом начало правлению Габсбургов в этих государствах.
Первый Объединённый фронт
Флаг Коммунистической партии Китая Первый Объединённый Фронт (или Альянс ГМД-КПК ) — альянс, сформированный в 1923 году ГМД и Коммунистической партией Китая. Положил конец Эре милитаристов в Китае. Совместно партии сформировали Национально-революционную армию и приняли участие в 1926 году в так называемом Северном походе 1926-27 гг..
Ходжаев, Низаметдин Исаметдинович
Низаметдин Исаметдинович Ходжаев (1885—1942) — узбекский большевик, активный участник установления Советской власти в Туркестане. Биография Совместно с М.Миршараповым возглавлял «старогородскую дружину» узбеков-коммунистов Ташкента, оказавшую основную помощь защитникам Советской власти в Ташкенте во время мятежа Осипова в январе 1919 года [1].
Основные даты Российской истории
Начало Древнерусского государства Завоевание Киева Олегом и его княжение 1682 1725 Царствование Петра I (до 1689г. - при регенстве Софьи, до 1696г. - совместно с Иваном V)
Базы и банки знаний
Санкт-Петербургский государственный технический университет Кафедра системного анализа и управления РАСЧЕТНОЕ ЗАДАНИЕ Дисциплина: базы и банки знаний.
Prolog. Реализация на ПЭВМ
Интегрированная среда языка Turbo Prolog. Структура программы на TURBO PROLOG. Предикаты работы с символьными данными. Работа с командами операционной системы.
Понятие лингвистической переменной. Язык программирования Prolog
Нечеткая лингвистическая переменная. Конструктивное описание лингвистической переменной. Структура управляющей логики в виде вычислений с откатами. Наиболее заметные тенденции в истории развития языка программирования Prolog, основные элементы синтаксиса.
Экспертная система для решения задачи о коммивояжере
Разработка, макетирование и реализация экспертной системы для решения задачи о коммивояжере, используя возможности языка Prolog. Составление графа "Карта Саратовской области" и решение проблемы поиска кратчайшего пути между двумя пунктами на карте.
Поиск оптимального пути в графе
Создание программы на языке программирования Visual Prolog. Разработка математической модели. Функциональные характеристики программы: оптимальный маршрут для такси. Интерфейс пользователя, руководство программиста, функциональная схема, тестовый пример.
Введение в программирование
Сущность отладки, условия ее выполнения. Ошибки при компиляции программы, создание и изменение исходных символьных файлов. Процесс преобразования кода в машинный. Первый программист, виды трансляторов, классификация и уровни языков программирования.
Основы языка Visual Prolog
1.1 ПРОграммирование в ЛОГике В Прологе решение задачи получается логическим выводом из ранее известных положений. Обычно программа на Прологе не является последовательностью действий, - она представляет собой набор фактов с правилами, обеспечивающими получение заключений на основе этих фактов.
Использование Prolog совместно с другими ЯП
Понятие Dll. Вспомним процесс программирования в DOS. Преобразование исходного текста в машинный код включал в себя 2 процесса: компиляцию и линковку. Во время линковки в код программы помещались не только объявления функций и процедур, но и их полный код.
Логические задачи на языке программирования Prolog
monax/order/ - рефераты на заказ (более 2300 авторов в 450 городах СНГ). Логические задачи на языке программирования Prolog Задание 1. Ввести предложенный текст программы, реализовать ее и записать на диск.
The Wife Of Bath Sovereignty Supremacy And
Dominance Essay, Research Paper The Wife of Bath: Sovereignty, supremacy, and dominance When reading the wife of Baths prologue and then her tale one can not help but to see the parallels present. The major parallel that exists is the subject of sovereignty. Who has it, which wants it, which deserves it and what will you do to get it? First we see that the Wife claims to have sovereignty over each of her husbands even though some were harder to gain dominance over than others.
Testing Tools Essay Research Paper Testing Tools
Testing Tools Essay, Research Paper Testing Tools, A Report on what is Commercially Available Introduction Once an application has been developed, the developers must demonstrate that it performs the tasks for which it was designed accurately, reliably and with adequate performance. For this to be fulfilled extensive testing must be carried out and tools have been built to assist with this process.
Зельман Ваксман
Ваксман, Зельман Абрахам (Waksman, Selman Abraham) (1888–1973), американский микробиолог, удостоенный в 1952 Нобелевской премии по физиологии и медицине за открытие стрептомицина – первого эффективного противотуберкулезного антибиотика.
Илья Мечников
Русский микробиолог и патолог, удостоенный в 1908 Нобелевской премии по физиологии и медицине (совместно с П.Эрлихом) за исследование природы иммунитета.
Аннан, Кофи
Аннан, Кофи (Annan, Kofi), (р. 1938), генеральный секретарь ООН, лауреат Нобелевской премии мира (совместно с ООН) «за вклад в создание более организованного мира и укрепление мира во всем мире».
Август Вассерман
Вассерман, Август (Wassermann, August von) (1866–1925), немецкий микробиолог и иммунолог.
Жак Моно
Французский биохимик и микробиолог, удостоенный в 1965 Нобелевской премии по физиологии и медицине (совместно с А.М.Львовым и Ф.Жакобом) за исследование процессов синтеза белка.
Джордж Майнот
Американский гематолог и патофизиолог, удостоенный в 1934 Нобелевской премии по физиологии и медицине.
Ахундов Мирза-Фетх-Али
Ахундов (Ахун-Задэ) Мирза-Фетх-Али [1812–1878] — крупнейший тюркский писатель Азербайджана, мыслитель, общественник и пионер нового тюркского алфавита. Родился в семье торговца из персидского Азербайджана.
Нойс Роберт (Noyce Robert Norton)
Нойс Роберт (Noyce Robert Norton - американский инженер, изобретатель (1959) интегральной схемы, системы взаимосвязанных транзисторов на единой кремниевой пластинке, основатель (1968, совместно с Г. Муром) корпорации Intel.