Константы стиля и толщины линий




(для предикатов GetLineStyle, SetLineStyle)

Значения параметра Linestyle:,Upattern,Thickness

0 – сплошная линия;

1 – точечная линия;

2 – штрих-пунктирная линия;

3 – пунктирная линия;

4 – стиль линии определяется пользователем;

 

Значения параметра Upattern задаются в виде списка 16-ричных кодов. Этот параметр работает только тогда, когда параметр Linestyle=4.

 

Значения параметра Thickness:

1 – толщина в один пиксель;

3 – толщина в три пикселя.

Константы типа шрифта

(задаются в предикате settextstyle(Font,Direction,Charsize))

Константы для параметра Font:

0 – точечный шрифт 8х8 элементов;

1 – тройной шрифт (триплекс) – файл TRP.CHR;

2 – штриховой шрифт уменьшенный – файл LITT.CHR;

3 – штриховой шрифт прямой – файл SANS.CHR;

4 – штриховой шрифт готический – файл GOTH.CHR;

 

Константы для параметра Charsize:

0 – размеры букв задаются пользователем

 

Константы для параметра Direction:

0 – слева направо;

1 – сверху вниз


Константы для выравнивания текста

(для предиката settextjustify(Horiz,Vert))

Значения для переменной Horiz:

0 – текст прижат к левому краю (располагается слева от указателя);

1 – текст центрируется по указателю;

2 – текст прижат к правому краю (располагается справа от указателя);

 

Значения для переменной Vert:

0 – текст располагается под указателем;

1 – текст центрируется по указателю;

2 – текст располагается над указателем.

 

Константы для закрашивания замкнутого контура изображения

(для предикатов setfillstyle(Pattern,Color)и getfillsettings(FillPattern,FillColor))

0 – заполнение участка цветом фона;

1 – заполнение участка сплошным цветом;

2 – заполнение участка пунктирными линиями стиля - - - - - -;

3 – заполнение участка линиями стиля / / / / / /;

4 – заполнение участка толстыми линиями стиля / / / / / /;

5 – заполнение участка толстыми линиями стиля \ \ \ \ \ \;

6 – заполнение участка линиями стиля / / / / / /;

7 – заполнение участка штриховыми линиями;

8 – заполнение участка штриховыми линиями стиля ХХХХХХ;

9 – заполнение участка в частую прямоугольную клетку;

10 – заполнение участка редкими точками;

11 – заполнение участка частыми точками;

12 – заполнение участка по шаблону, заданному пользователем.

 

Лабораторная работа 7

Тема работы: работа с графами и деревьями в среде Turbo Prolog

Цель работы: ознакомление с возможностями обработки информации, представленной в виде графов и деревьев в среде Turbo Prolog 2.0 и приобретение практических навыков создания и использования структур данных для представления и обработки графов и деревьев.

Темы для предварительной проработки

§ Работа со структурами данных.

§ Работа с внешней базой данных.

§ Возврат и отсечение.

§ Рекурсия.

 

Постановка задачи: написать программу на языке Turbo Prolog, содержащую собственные и встроенные предикаты для работы с деревьями или графами и правила, реализующие поставленное задание.

7.1. Порядок выполнения работы

1. Выбрать индивидуальное задание согласно номеру фамилии в журнале группы.

2. Разработать метод решения задачи и предикаты для его реализации на языке Turbo Prolog.

3. Загрузить Turbo Prolog.

4. Определить и реализовать способ хранения данных, представляющих дерево или граф, во внешнем файле.

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

6. Объяснить особенности использования разработанных предикатов, определить, какие из используемых переменных являются входными и какие - выходными.

7.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание метода решения задачи.

4. Описание применяемых стандартных и разработанных предикатов.

5. Текст программы.

6. Результаты тестирования программы.

7. Выводы.

7.3. Индивидуальные задания

1. Построить двоичное дерево. Определить его глубину.

2. Построить двоичное дерево. Реализовать возможность добавления к нему новой вершины.

3. Построить двоичное дерево. Реализовать возможность удаления вершины из него.

4. Построить двоичное дерево. Реализовать возможность каскадного удаления из него вершин.

5. Построить двоичное дерево. Вывести на экран имена всех вершин указанного уровня.

6. Построить двоичное дерево. Реализовать возможность вывода имен всех листьевых вершин.

7. Построить двоичное дерево. Реализовать возможность подсчета количества всех листьевых вершин.

8. Построить двоичное дерево. Реализовать возможность подсчета количества всех нелистьевых вершин.

9. Построить двоичное дерево. Посчитать количество вершин левой ветви.

10. Построить двоичное дерево. Посчитать количество вершин правой ветви.

11. Построить двоичное дерево. Посчитать количество листьевых вершин левой ветви.

12. Построить двоичное дерево. Посчитать количество нелистьевых вершин левой ветви.

13. Построить двоичное дерево. Посчитать количество листьевых вершин правой ветви.

14. Построить двоичное дерево. Посчитать количество нелистьевых вершин правой ветви.

15. Построить двоичное дерево. Посчитать количество уровней от заданного уровня до конечного.

16. Построить двоичное дерево. Определить, какая ветвь имеет большее количество вершин – левая или правая.

17. Построить двоичное дерево. Определить, какая ветвь имеет большее количество уровней – левая или правая.

18. Построить двоичное дерево. Определить, на каком уровне находится заданная вершина.

19. Построить граф с заданными стоимостями дуг. Определить длину пути от одной заданной вершины к другой.

20. Построить ориентированный граф с заданными стоимостями дуг. Определить максимальную длину пути от одной заданной вершины к другой.

21. Построить ориентированный граф с заданными стоимостями дуг. Определить минимальную длину пути от одной заданной вершины к другой.

22. Построить неориентированный граф. Определить количество вершин всех путей от одной заданной вершины к другой.

23. Построить граф с заданными стоимостями дуг. Определить количество переходов минимального по стоимости пути от одной заданной вершины к другой.

24. Построить граф с заданными стоимостями дуг. Определить количество переходов максимального по стоимости пути от одной заданной вершины к другой.

25. Построить граф с заданными стоимостями дуг. Определить, существует ли путь от одной заданной вершины к другой.

26. Построить граф с заданными стоимостями дуг. Определить путь с минимальным количеством переходов от одной заданной вершины к другой.

27. Построить граф с заданными стоимостями дуг. Определить путь с максимальным количеством переходов от одной заданной вершины к другой.

28. Построить граф с заданными стоимостями дуг. Определить, имеет ли решение задача о коммивояжере на базе имеющихся исходных данных.

29. Построить двоичное дерево. Проверить, входит ли в него заданный элемент.

30. Построить неориентированный граф с заданными стоимостями ребер. Определить все возможные пути от одной заданной вершины к другой и стоимости этих путей.

7.4. Пример решения задачи

1. Тема: работа с графами и деревьями в среде Turbo Prolog.

2. Цель работы: ознакомление с возможностями обработки графов и деревьев в среде Turbo Prolog 2.0 и приобретение практических навыков создания и использования структур данных для представления и обработки деревьев и графов.

3. Индивидуальное задание: построить неориентированный граф с заданными стоимостями ребер, определить все возможные пути от одной заданной вершины к другой и стоимости этих путей.

4. Разработка метода решения задачи.

Для решения поставленной задачи предлагается представить граф, элементами которого являются факты, содержащие сведения о связи двух вершин между собой и о стоимости такой связи. Такой факт (прил. 7Б) представляется в виде d(вершина1,вершина2,стоимость). Факты целесообразно хранить во внешнем текстовом файле der8_db.pro.

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

У пользователя спросить имена исходной и целевой вершин и проверить, входят ли они в граф. Эти действия выполняет предикат v3(вершина, список_вершин). Если вершина не входит в граф, на экран выводится соответствующее сообщение и работа программы завершается. Если вершины входят в граф, инициируется поиск всех возможных путей между ними (предикат v), подсчет стоимостей путей и вывод на экран результата.

Собственно поиск путей выполняет предикат р1(вершина, путь, стоимость).

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Предикаты файла der8.pro

Предикаты Назначение
b(ii) База данных найденных путей и их стоимостей
d(i,i,i) База данных, описывающая граф: d(вершина1,вершина2,стоимость)
p(ii) Составление упорядоченного списка вершин графа
p1(i,ii,i) Предикат поиска пути: р1(вершина, путь, стоимость)
v1(i,i,i) Проверка наличия связи между двумя вершинами: v1(вершина1, вершина2, флаг_наличия_связи)
v2(i,ii) Проверка вхождения вершины в найденный список вершин (путь): v2(вершина, путь)
v3(i,ii) Проверка вхождения вершины в граф: v3(вершина, список_вершин)
v Инициация поиска пути

Предикаты файла sort.pro:

Предикаты Назначение
men(i,ii,ii,ii) Деление списка на два результирующих списка относительно значения первого элемента: men(элемент,исходный_список,рез_список1,рез_список2)
sort_quick(ii,ii) Выполнение «быстрой сортировки» списка: sort_quick(исх_список, отсортированный_список)
konk(ii,ii,ii) Конкатенация двух списков: konk(список1, список2, объединенный_список)
ud(ii,ii) Удаление из списка одинаковых элементов: ud(исх_список, результирующий_список)

 

6. Стандартные предикаты, используемые для решения задачи:

Стандартные предикаты для работы с оперативной базой данных взяты из Приложения 2Б.

7. Текст программы.

%Выполняет поиск всех существующих путей на графе

include "sort.pro" % Подключение файла sort.pro

database

b(ii) % База данных найденных путей и их стоимостей

d(i,i,i) %База данных - граф

% d(вершина1,вершина2,стоимость)

predicates

p(ii) %Составление упорядоченного списка вершин графа

p1(i,ii,i) %Поиск пути

v1(i,i,i) %Проверка наличия связи между двумя вершинами

v2(i,ii) %Проверка вхождения вершины в найденный список

% вершин (путь)

v3(i,ii) %Проверка вхождения вершины в граф

v %Инициализация поиска пути

 

clauses

%Составление упорядоченного списка вершин графа

p(P):-

findall(X,d(X,_,_),P1), % Составление списка "левых" вершин

findall(Y,d(_,Y,_),P2), % Составление списка "правых" вершин

konk(P1,P2,P3), % Конкатенация списков (см. файл sort.pro)

sort_quick(P3,P4), % Сортировка списка (см. файл sort.pro)

ud(P4,P). % Удаление из списка одинаковых элементов

% (см. файл sort.pro)

 

Продолжение программы

%Поиск пути

p1(X,[X|P],S):- % Завершение рекурсии, если голова списка

% равна исходной вершине (первый аргумент)

PP=[X|P], %Список вершин пути записывается в переменную РР

write(PP," S=",S), % Вывод на экран пути и его стоимости

nl.

p1(X,[Z|P],S):- % Вершина Z присоединяется к пути после

% выполнения следующих далее проверок

v1(Y,Z,S1), % Проверка наличия связи между вершинами Х и Y

v2(Y,P), % Проверка вхождения вершины Х в путь

S2=S+S1, % Добавление веса ребра к стоимости пути

p1(X,[Y,Z|P],S2). % Рекурсивный вызов

 

%Проверка наличия связи между вершинами Х и Y

v1(X,Y,S1):- % Определение веса ребра

d(X,Y,S1). % по найденному факту связи вершин

v1(X,Y,S1):-

d(Y,X,S1).

 

%Проверка вхождения вершины в найденный список вершин (путь)

v2(_,[]). % Если список-путь пуст, то вершина

% в него не входит

v2(X,[Y|P]):- % Проверка вхождения вершины в список

X<>Y, % Если вершина не равна голове списка,

v2(X,P). % то продолжать поиск

 

%Проверка вхождения вершины в граф

v3(X,[X|_]):-!. % Если вершина равна голове списка,

% то она входит в граф

v3(X,[_|P]):- % Рекурсивное правило

v3(X,P). % (вторая формулировка)

v3(X,[]):- % Во всех остальных случаях вершина

% не входит в граф.

nl,write("Вершина ",X," не входит в граф!"),

nl,write("Путей нет!"),

readint(_),fail.

 

%Инициация поиска путей

v:-

b(P),write("Список вершин:"),nl,

write(P),nl,

write("Исходная вершина:"),nl,

readint(X),

v3(X,P), %Проверка вхождения исходной вершины в граф

write("Целевая вершина:"),nl,

readint(Y),

v3(Y,P), %Проверка вхождения целевой вершины в граф

write("Найденные пути и их стоимости:"),nl,

p1(X,[Y],0), %Поиск путей

fail.

Продолжение программы

v.

 

goal

clearwindow, %Очистка экрана

retractall(d(_,_,_)), % Очиска оперативной памяти

retractall(b(_)),

consult("der8_db.pro"),% Загрузка базы данных

p(P), % Составление списка вершин графа

asserta(b(P)), % Добавление списка вершин в опер. память

v,nl, % Инициация поиска путей

write("*****"). % Конец работы

 

К основной программе подключается файл sort.pro, содержащий вспомогательные предикаты для выполнения конкатенации и сортировки списков и удаления одинаковых элементов из списка:

domains i=integer ii=i*

predicates

men(i,ii,ii,ii) % Делит список на два списка относительно значения

% первого элемента

sort_quick(ii,ii) % Выполнение «быстрой сортировки» списка

konk(ii,ii,ii) % Конкатенация двух списков

ud(ii,ii) % Удаление из списка одинаковых элементов

clauses

men(_,[],[],[]). % Условие завершения рекурсии:

% когда второй параметр-список пуст, третий и четвертый

% параметры – тоже пустые списки.

men(A,[B|X],[B|L1],L2):- %Если голова В списка-второго параметра

B<A,men(A,X,L1,L2). % меньше, чем первый параметр предиката,

% то эта голова сцепляется

% со списком-третьим параметром предиката,

% а четвертый параметр-список остается

% без изменений.

 

men(A,[B|X],L1,[B|L2]):- %Во всех остальных случаях голова В

men(A,X,L1,L2). % списка-второго параметра сцепляется

% со списком четвертым параметром предиката,

% а третий параметр-список остается

% без изменений.

 

sort_quick([],[]). % Когда первый список пуст, второй тоже пуст

sort_quick([A|X],R):- % Выделяется голова первого списка

men(A,X,L1,L2), % Вызов предиката men, который

% возвращает два списка –

% L1 (его элементы меньше элемента А), и

% L2 (его элементы больше элемента А).

sort_quick(L1,M1), % Вызов сортировки списка L1. Возвращается

Продолжение программы

% отсортированный список М1

sort_quick(L2,M2), % Вызов сортировки списка L2. Возвращается

% отсортированный список М2

konk(M1,[A|M2],R). % Конкатенация списков М1, М2 и головы А

 

%Конкатенация списков

konk([],Z,Z). %Когда первый список пуст,

% третий список равен второму

konk([X|Y],Z,[X|R]):- % Голова первого списка присоединяется

% в начало третьего списка

konk(Y,Z,R). % Рекурсивный вызов

 

%Удаление из списка одинаковых элементов

ud([X],[X]). %Когда первый список состоит из одного элемента,

% второй список состоит из этого же одного элемента.

ud([A|X],P):- % В первом списке выделяется голова А и хвост Х

ud(X,[Y|P1]), % Выполняется рекурсивный вызов и сцепление

% головы Y и хвоста Р1 во втором списке

A<Y, % Если А меньше Y, то

P=[A,Y|P1]. % список Р представляет собой сцепление элементов

% А, Y и хвоста Р1.

ud([_|X],P):- %Рекурсивное правило для перебора всех элементов

% первого списка.

ud(X,P).

 

База данных, представляющая дерево, хранится в файле der8_db.pro в следующем виде:

d(1,2,2).

d(2,4,1).

d(1,3,3).

d(2,5,5).

d(5,6,1).

d(3,6,2).

d(1,7,1).

d(7,8,3).

d(8,6,2).

8. Выводы

При выполнении лабораторной работы были изучены особенности представления графов и деревьев в Прологе с помощью структур. Для реализации индивидуального задания были разработаны рекурсивные предикаты. Программа реализована по модульному принципу.

Контрольные вопросы

1. Объясните отличия графа и дерева.

2. Что такое цикл?

3. Что такое путь?

4. Что такое ациклический путь?

5. Что такое двоичное дерево?

6. Назовите способы представления графов и деревьев в Прологе.

7. Что такое структура в Пролое?

8. Что такое терм и функтор?

9. Для чего используются структуры?

Приложение 7А

Основные сведения о структурах данных

Аргументы выражений Пролога называются термами. Существует три вида термов:

Константа - Атом, записываемый как слово, начинающееся с маленькой буквы, произвольная группа символов, заключенных в двойные кавычки или число.

Переменная - записывается как слово, начинающееся с большой буквы, слово, начинающееся со знака подчеркивания или сам знак подчеркивания.

Составной терм (структура) - записывается как

выр(арг1, арг2, …, аргn), где аргументы сами являются выражениями.

Структуры Пролога аналогичны записям Паскаля и структурам языка С. Структуры – это составной тип данных, конструируемый программистом. Структуры служат для представления данных об объектах, аргументами структур могут быть как атомы, так и объекты. Структуру можно назвать составным термом. Структура, рассмотренная ниже, содержит информацию об аудиторном занятии:

 

занятие(преподаватель(кафедра, ФИО), группа(факультет, индекс),

проведение(время, аудитория), вид_занятия)

 

Объект занятие, представленный такой структурой, называется составным объектом. Термы преподаватель, группа, проведение являются функторами, т.е. предикатами, вставленными внутрь другого предиката. Пролог позволяет объявлять составные объекты в разделе domains. Если структура содержит объекты разных типов, она называется многодоменной структурой. Структура обеспечивает средство сортировки объектов по категориям. Ссылки на доменную структуру осуществляются по имени функтора.

Структуры могут определяться рекурсивно. Рекурсивные структуры могут использоваться для описания различных видов сложных взаимосвязей между термами. Рекурсивная структура в качестве аргумента содержит описание того же домена, к которому принадлежит сама. Примером рекурсивной структуры является структура для описания двоичного дерева.

ПРИЛОЖЕНИЕ Б

Краткие сведения о графах и деревьях

В настоящее время теория графов применяется для решения транспортных задач, составления расписания, распределения потоков, представления знаний, выполнения логических выводов и т.д..

Графом называется графическое отображение поименованных точек (вершин) и соединяющих их линий. Соединительные линии без указания направления называются ребрами (рис. П7Б.1). Линии могут быть направленными и иметь стрелку на одном конце, они называются дугами. Граф с дугами называется ориентированным (рис. П7Б.2). Как ребра, так и дуги могут иметь числовую характеристику (вес или стоимость). Такой граф называют нагруженным (рис. П7Б.2).

 

 
 

 

 


Рисунок П7Б.1 – Неорентированный Рисунок П7Б.2 – Ориентированный

граф граф

 

Граф задается непустым множеством вершин и непустым множеством ребер (дуг).

В Прологе графы можно представить несколькими способами.

Первый способ – каждое ребро записывается в виде одного факта. Например, графы, изображенные на рис. П7Б.1 и рис П7Б.2 можно представить так:

граф(“A”,”D”).

Продолжение прил. 7Б

граф(“D”,”C”).

................

ор_граф(“A”,”B”,3).

ор_граф(“A”,”D”,1).

ор_граф(“D”,”A”,2).

Другой способ – представление графа в виде одного объекта. В этом случае грая описывается в виде списка вершин и списка ребер. Для наших примеров это может выглядеть так:

Граф1=([“А”,”B”,”C”,”D”],

[ребро(“A”,”D”),ребро(“A”,”C”),ребро(“D”,”C”),ребро(“B”,”C”)])

Граф2=([“А”,”B”,”C”,”D”], [дуга(“A”,”D”,1),дуга(“D”,”А”,2),

дуга(“A”,”В”,3),дуга(”C”,“D”,6),дуга(“B”,”C”,4)])

Еще один способ – представить связи каждой вершины, например:

Граф1=(связь1(“A”,[“D”,”C”]),связь1(“D”,[“C”]),связь1(“C”,[“B”]))

Граф2=(связь2(“A”,[[“D”,1],[”B”,3]]),связь2(“D”,[[“A”,2]]),

связь2(“C”,[[“D”,6]]), связь2(“B”,[[”C”,4)]]))

Выбор способа представления графа зависит от решаемой задачи и операций над графом. Типичные операции – нахождение путей между двумя вершинами, а также подграфа, обладающего определенными свойствами.

Путь – это список последовательно связанных вершин от начальной до целевой. Цикл – это путь, в котором начальная вершина равна целевой. Ациклический путь не содержит циклов, т.е. в нем каждая вершина входит в список только один раз.

Деревом называется граф, не содержащий циклов. Для каждой пары вершин дерева существует только один путь (рис. П7Б.3).

 

Рисунок П7Б.3 – Дерево

Вершина 1 называется корнем дерева, вершины 12–16 – листьями. Наибольшее количество уровней между корневой и листьевыми вершинами называется высотой дерева. Дерево состоит из ветвей (поддеревьев).

Одним из видов дерева является двоичное дерево. Двоичное дерево либо пусто, либо состоит из следующих эелементов:

· корень дерева;

· левая ветвь (поддерево);

· правая ветвь(поддерево).

Корень может быть любой вершиной, а поддеревья сами должны быть двоичными деревьями.

Для представления двоичных деревьев в Прологе существует ряд способов. Рассмотрим один из них. Введем понятие пустого дерева – nil (это обозначение может быть любым). Кроме этого, разработаем функтор (специальную структуру) для построения непустого дерева из трех компонент (корня и двух ветвей):

tree = nil; %Символ пустого дерева

tr(tree,i,tree) %Структура для непустого дерева

%tr(Левая_ветвь,корень,правая_ветвь)

Приведем пример двоичного дерева и представления его с помощью такой структуры (рис. П7Б.4).

 

 

Рисунок П7Б.4 – Двоичное дерево и его представление на Прологе

 

%Выполняет построение двоичного дерева, вершины которого поименованы целыми %числами

domains i=integer

tree = nil; %Символ пустого дерева

tr(tree,i,tree) %Структура для непустого дерева

%tr(Левая_ветвь,корень,правая_ветвь)

predicates

der1(i,tree) %Сроит первичное (начальное) дерево,

%начиная от указанного корня

der(tree,tree) %Достраивает ветвь - первый параметр входной,

%второй - выходной

der2(tree,tree) %Строит дерево полностью - первый параметр входной,

%второй - выходной

database

f(i,i,i) %Дерево хранится в виде фактов (базы данных):

%f(вершина_слева,корень,вершина_справа)

clauses

f(2,1,3). f(4,2,5). f(0,6,0). f(6,3,0).

f(0,5,8). f(0,8,0). f(7,4,9).f(0,7,0).

f(10,9,0).f(0,10,0).

 

%der1 строит первичное (начальное) дерево

der1(X,T1):- %Работает, если левая ветвь пуста

f(0,X,R),

R1=tr(nil,R,nil), %Строится правая ветвь

T=(tr(nil,X,R1)), %Вид построенного начального дерева

der(T,T1). %Вызов предиката для построения оcтальной части дерева

 

der1(X,T1):- %Работает, если правая ветвь пуста

f(L,X,0),

L1=tr(nil,L,nil), %Строится левая ветвь

T=(tr(L1,X,nil)), %Вид построенного начального дерева

der(T,T1). %Вызов предиката для построения оcтальной части дерева

 

der1(X,T1):- %Работает, если левая и правая ветви не пусты

f(L,X,R),

L1=tr(nil,L,nil), %Строится правая ветвь

R1=tr(nil,R,nil), %Строится правая ветвь

T=(tr(L1,X,R1)), %Вид построенного начального дерева

der(T,T1). %Вызов предиката для построения оcтальной части дерева

 

%der2 достраивает ветвь

der2(tr(nil,X,nil),tr(nil,X,nil)):-

retract(f(0,X,0)). %достраивается лист

 

der2(tr(_,X,nil),L):- %достраивается не-лист

f(A,X,0), %с левой ветвью

L1=tr(nil,A,nil),

L=tr(L1,X,nil),

retract(f(A,X,0)).

 

der2(tr(nil,X,_),L):- %достраивается не-лист

f(0,X,A), %с правой ветвью

R1=tr(nil,A,nil),

L=tr(nil,X,R1),

retract(f(0,X,A)).

 

der2(tr(_,X,_),L):- %достраивается не-лист

f(A,X,B), %с обеими ветвями

L1=tr(nil,A,nil),

R1=tr(nil,B,nil),

L2=tr(L1,X,R1),

retract(f(A,X,B)),

der(L2,L).

 

%строит дерево полностью

der(tr(L,X,R),T):-

der2(L,L1), %строит полностью левую ветвь

der2(R,R1), %строит полностью правую ветвь

der(tr(L1,X,R1),T).

der(X,X).

 

goal

clearwindow,der1(1,P),nl,

write(P).

 


СПИСОК ЛИТЕРАТУРЫ

 

1. Братко И. Программирование на языке ПРОЛОГ для искусственного интеллекта.- М.:Мир, 1990.

 

2. Малпас Д. Реляционный язык Пролог и его применение. – М.: Наука, 1990.

 

3. Макаллистер Д. Искусственный интеллект и Пролог на микро-ЭВМ. – М.:Машиностроение, 1990.

 

Содержание

Предисловие.. 3

лабораторная работа 1. 5

лабораторная работа 2. 19

лабораторная работа 3. 30

лабораторная работа 4. 44

лабораторная работа 5. 49

лабораторная работа 6. 59

лабораторная работа 7. 78

 


Навчальне видання

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: