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

Составные списки

Список целых может быть заявлен просто

integerlist = integer*

Это справедливо для списка действительных чисел, списка символов или

списка строк.

Однако, часто бывает важно иметь внутри одного списка комбинацию

элементов принадлежащих разным типам, такие как:

[2, 3, 5.12, [food, "goo"], "new"]

/*некорректно в Турбо Прологе*/

Составные списки - это списки, в которых используется более чем один

тип. Для работы со списками из разнотипных элементов нужны специальные

декларации потому, что в Турбо Прологе требуется, чтобы все элементы

списка принадлежали бы одному типу. Чтобы создать список, который бы хра-

нил различные типы элементов, в Прологе необходимо использовать функторы,

потому, что domain может содержать более одного типа данных как аргументы

для функторов.

Далее покажем пример объявления доменов для списка, который может

содержать символьные, целые, строчные и другие. Заявление списка должно

иметь функтор такой, как показано и поэтому должен быть заявлен рекурсив-

но. Вот объявление доменов, которое нужно для создания такого списка:

domains /* функторы : l, s, i, c и t*/

llist = l(list); s(symbol); i(integer); c(char); t(string)

list = llist*

Список

[2, 9, [food, "goo"], "new"] /*некорректно в Турбо Прологе*/

должен быть представлен в Турбо Прологе как

[i(2), i(9), l([s(food), t("goo")]), t("new")]

/*корректно для Турбо Пролога*/

Ниже приведен пример, показывающий объединение списков, и использо-

вание объявления доменов в типичной программе работы со списками.

/*Программа CH08EX09.PRO - Комбинированные списки*/

domains

llist = l(list); s(symbol); i(integer); c(char); t(string)

list = llist*

predicates

append(list, list, list)

goal

makewindow(1, 7, 7, "answer", 15, 0, 8, 80),

/* * * * * * * * * * * * * * * * * * * * * * * * * * * *

* Заметьте, как можно использовать такую же запись, *

* но добавить функторы *

* append([ likes, [bill, mary] ], [bill, sue ], Ans) *

* * * * * * * * * * * * * * * * * * * * * * * * * * * */

append([s(likes),l([s(bill),s(mary)])],[s(bill),s(sue)],Ans),

write("FIRST LIST: ", Ans), n1, n1,

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* Фокус в том, что сначала записывается список, а *

* затем добавляютя функторы *

* append([apple, [ [ [47], '\1'] ], *

* [ [ [ "This is a string", b, 7, 'W'] ], bee], *

* [ 'c' ], Ans2) *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

append([1, s(bee)], [c('c')], Ans2),

write("SECOND LIST: ", Ans2), n1.

clauses

/*..........................*/

append([]), L, L).

append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).

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