Структура программы на Прологе. Управление выполнением программы
Особенности
Разделы программы
Особенности
Программа, состоящая только из цели
Директивы компилятора
Особенности
Константы
Домены
Описание собственного домена
Описание структурного домена
Описание предикатов
Стандартные предикаты
Стандартные предикаты
Программа «Родственники»
Управление выполнением программы
Бэктрекинг
Метод отката после неудачи
Метод отката после неудачи
Метод отката после неудачи
Метод отката после неудачи
Отсечение и откат
Метод повтора, определяемый пользователем
598.50K
Category: programmingprogramming

Структура программы на Прологе. Управление выполнением программы (лекция № 4)

1. Структура программы на Прологе. Управление выполнением программы

Лекция № 4

2. Особенности

Visual Prolog – компилируемый язык
Строгая типизация данных
Правила не рассматриваются как данные
(нет возможности добавлять и удалять их
во время исполнения программы)
Нельзя определять операции

3. Разделы программы

директивы компилятора;
CONSTANTS - раздел описания констант;
DOMAINS - раздел описания доменов;
DATABASE - раздел описания предикатов
внутренней базы данных;
PREDICATES - раздел описания
предикатов;
CLAUSES - раздел описания
предложений;
GOAL - раздел описания внутренней цели.

4. Особенности

Все разделы могут располагаться в любом
порядке
Предикаты и домены должны быть описаны
до использования
В описании структурного домена можно
использовать домены, описанные ниже по
тексту
Предикаты, описанные в разделе DATABASE,
могут быть добавлены и удалены из
внутренней базы данных в процессе
выполнения программы

5. Программа, состоящая только из цели

GOAL
write("hello"),readchar(_).

6. Директивы компилятора

trace – для трассирования программы
nowarnings - для подавления
предупреждения системы о том, что какая-то
переменная встречается в предложении
только один раз
include - вставка содержимого некоторого
файла
check_determ – принудительная проверка
детерминированности предикатов

7. Особенности

Трассировку можно запустить только
по определенным предикатам
При наличии трассировки не работает
оптимизация хвостовой рекурсии
Установить по умолчанию
недетерминированность предикатов:
Options – Project – Compiler options –
Warnings – Default predicate type –
Nondeterm

8. Константы

CONSTANTS
pi=3.14
path="c:\\prolog\\bgi"

9. Домены

integer - целое число (-32768...32767)
real - действительное число (±e-307...±e308)
char - символ в одиночных апострофах
string - последовательность символов в
кавычках
symbol - символическая константа (атом)
file - файл

10. Описание собственного домена

<имя домена> = <определение домена>
или
file = <символическое имя файла1>; ...;
<символическое имя файлаN>
или
<имя спискового домена> = <имя домена элементов
списка>*
Например:
DOMAINS
i=integer
list=i*

11. Описание структурного домена

<имя структуры> = <имя функтора> (<имя домена первой
компоненты>, ..., <имя домена последней компоненты>)
[;<имя функтора>(...)]*
Например:
flatpoint = p(integer, integer)
triangle = tr(point, point, point)
fullpoint = p(integer, integer); p(integer, integer, integer)

12. Описание предикатов

<имя предиката> (<имя домена первого аргумента>,
..., <имя домена n-го аргумента>).
Например:
PREDICATES
mother(string,string).
member(integer,integer*).
member(real,real*).
member(char,char*).
member(string,string*).
Один и тот же предикат
будет работать с
данными различных
доменов

13. Стандартные предикаты

readln(_)
readint(_)
readreal(_)
readchar(_)
readterm(имя_домена,
терм_домена)
write([<переменная /
константа /
значение>,…])
writef – форматный
вывод
nl
upper_lower(_,_)
str_int(_,_)
str_real(_,_)
str_char(_,_)
char_int(_,_)
true
fail
free(_)
bound(_)

14. Стандартные предикаты

div()
mod()
trunc()
round()
random(_)
random(<число>,_)
Все встроенные предикаты – детерминированные

15. Программа «Родственники»

DOMAINS
s=string
PREDICATES
nondeterm mother(s,s)
nondeterm grandmother(s,s)
CLAUSES
mother("Наташа","Даша").
mother("Даша","Маша").
grandmother(X,Y):mother(X,Z),
mother(Z,Y).
Правила хорошего тона:
1) между процедурами –
пустая строка;
2) тело правила – с новой
строки с отступом;
3) каждая подцель тела – с
новой строки с отступом.
Как выглядит цель для
поиска всех бабушек?
Как выглядит цель для
поиска всех мам?
Как выглядит цель для
поиска всех мам и
последовательным выводом
всех решений по нажатию
клавиши?

16. Управление выполнением программы

1. Метод поиска в глубину (бэктрекинг)
2. Метод отката после неудачи
3. Отсечение и откат
4. Метод поиска, определяемый
пользователем

17. Бэктрекинг

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
Внешняя цель:
grandmother(B,V)

18. Метод отката после неудачи

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
GOAL
grandmother(B,V),
write(“Имя бабушки – “,B),
write(“Имя внучки – “,V)

19. Метод отката после неудачи

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
GOAL
grandmother(B,V),
write(“Имя бабушки – “,B),
write(“Имя внучки – “,V), nl, fail.

20. Метод отката после неудачи

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
show_names
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
show_names:–
mother(_,Name),
write(" ", Name), nl,
fail.
GOAL
write(“Имена дочек:”),nl,
show_names.

21. Метод отката после неудачи

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
show_names2(s)
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
show_names2(Mother):–
mother(M,Name),
M=Mother,
write(" ", Name), nl,
fail.
GOAL
write(“Имена дочек Даши:”),nl,
show_names2(“Даша”).

22. Отсечение и откат

DOMAINS
s=string
PREDICATES
mother(s,s)
grandmother(s,s)
show_names3(s)
CLAUSES
mother("Даша","Маша").
mother("Наташа",”Даша").
mother("Наташа",”Глаша").
mother("Даша",”Саша").
grandmother(X,Y):–
mother(X,Z),
mother(Z,Y).
show_names3(Daughter):–
mother(_,Name),
write(" ", Name), nl,
Name=Daughter,
write("Искомый человек найден!"),!.
GOAL
write(“Имена всех дочек до Глаши:”),nl,
show_names3(“Глаша”).

23. Метод повтора, определяемый пользователем

repeat.
repeat:repeat.
double_char:–
repeat,
readchar(C),
write(C,C), nl,
C=’.’,!,
nl,write("Была введена точка. Закончили.").
GOAL
write(“Вводятся символы, которые нужно повторить. Точка –
завершение”),
nl,
double_char.
English     Русский Rules