Скачиваний:
141
Добавлен:
17.06.2016
Размер:
3.31 Mб
Скачать

Примеры.

Следующий пример программы представляет собой код для создания функ-

тора Турбо Пролога в Турбо Си и возврата этой структуры в Турбо Пролог.

Этот пример также демонстрирует, как может быть распределена память в

глобальном стеке Турбо Пролога.

Предикат pack принимает integer, char, real и string и комбинирует

их в составной объект пользовательского домена mydom.

Сперва рассмотрим исходный текст на Турбо Прологе:

/*Программа CH22EXO5.PRO*/

project "mypack"

global domains

mydom = f(integer, char, real, string)

global predicates

pack(integer, char, real, string, mydom) -(i,i,i,i,o)

language c

goal

pack(1, 'a', 99.9, "HELLO", X),

write(X), nl.

А теперь исходный текст на Турбо Си.

/*Программа CH22EXO6.C*/

void *alloc_gstack(unsigned);

typedet struct {

unsigned char functor; /*Type of functor*/

int ival; /*Value of the functor*/

char cval;

double rval;

char *sval;

} mydom;

pack_0(int P1, char P2, double P3, char **P4, mydom **P5)

{

mydom *p=*P4=alloc_gstack(sizeof(mydom));

p->functor=1;

p->ival=P1;

p->cval=P2;

p->rval=P3;

p->sval=P4;

}

Заметьте, как вызов alloc_gstack выделяет место в глобальном стеке

для структуры размером в sizeof(mydom) байт.

Система Турбо Пролог свяжет модули .OBJ для этих двух исходных, если

вы выберете Compile/Project, а файл .PRJ, MYPACK.PRJ, будет определен как

CH22EXO5

CH22EXO6

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

В этом разделе мы дадим более полезный пример, который покажет, как

преобразовать список в массив и обратно.

Программа Си ListToArray принимает список целых чисел, преобразует

его в массив, расположенный в глобальном стеке и возвращает число элемен-

тов. Преобразование выполняется в три этапа:

1. Список просматривается для того, чтобы определить

количество элементов.

2. Отводится память для массива.

3. Список просматривается снова, его элементы переносятся в

массив.

Программа Си ArrayToList принимает целочисленный массив и его размер

как аргументы, затем преобразует их в список целых чисел. Эта программа

делает только один прогон, строя список по мере просмотра массива.

Внешняя процедура inclist показывает, как использовать ListToArray и

ArrayToList. Если задан список целых чисел, то inclist преобразует вход-

ной список в массив, увеличивает число элементов массива на 1, затем пре-

образует массив обратно в список целых чисел.

/*Программа CH22EXO7.PRO*/

project "mycnvrt"

global domains

list = integer*

global predicates

inclist(list, list) - (i,o) language c

goal

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

Ниже идет программа Си, определяющая две процедуры Си ListToArray и

ArrayToList и внешний предикат Турбо Пролога inclist.

/*Программа CH22EXO8.C*/:

&define listfno 1

&define nilfno 2

void *alloc_gstack(unsigned);

typedet struct ilist {

unsigned char Functor;

int Value;

struct ilist *Next;

} IntList;

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

{ /*Convert a list to an array placed on the global stack*/

IntList *SaveList = List;

int *Array;

int i = o;

/*Счетчик количества элементов в списке*/

for(i=o; List->Functor==listfno; List=List->Next)

i++;

Array = alloc_gstack(i*sizeof(int)); /* Определение

необходимой памяти*/

List = SaveList; /* Пересылка элементов из списка в

массив */

for(i=o; List->Functor==listfno; List=List->Next)

Array[i++]=List->Value;

*ResultArray=Array;

return(i);

}

ArrayToList(int Array[],int n,IntList **List) /*Преобразование

массива в список*/

{

int i;

for (i=o; i<n; i++) /*Нахождение записи каждого элемента*/

{

IntList *p=*List=alloc_gstack(sizeof(IntList));

p->Functor=listfno;

p->Value=Array(i);

List=&(*List)->Next;

}

{ /*Нахождение последней записи в списке*/

IntList *p=*List=alloc_gstack(sizeof(char));

p->Functor=nilfno;

}

}

inclist_0(IntList *InList,IntList **OutList)

{ /* Увеличение на 1 всех значений в

списке*/

int i, n, *Array;

n=ListToArray(InList,&Array);

for (i=o; i<n; i++) Array[i]++;

ArrayToList(Array,n,OutList);

}

Соседние файлы в папке Документация