Similar presentations:
lecture04
1. Структура программы на Прологе. Управление выполнением программы
Лекция № 42. Особенности
Visual Prolog – компилируемый языкСтрогая типизация данных
Правила не рассматриваются как данные
(нет возможности добавлять и удалять их
во время исполнения программы)
Нельзя определять операции
3. Разделы программы
директивы компилятора;CONSTANTS - раздел описания констант;
DOMAINS - раздел описания доменов;
DATABASE - раздел описания предикатов
внутренней базы данных;
PREDICATES - раздел описания
предикатов;
CLAUSES - раздел описания
предложений;
GOAL - раздел описания внутренней цели.
4. Особенности
Все разделы могут располагаться в любомпорядке
Предикаты и домены должны быть описаны
до использования
В описании структурного домена можно
использовать домены, описанные ниже по
тексту
Предикаты, описанные в разделе DATABASE,
могут быть добавлены и удалены из
внутренней базы данных в процессе
выполнения программы
5. Программа, состоящая только из цели
GOALwrite("hello"),readchar(_).
6. Директивы компилятора
trace – для трассирования программыnowarnings - для подавления
предупреждения системы о том, что какая-то
переменная встречается в предложении
только один раз
include - вставка содержимого некоторого
файла
check_determ – принудительная проверка
детерминированности предикатов
7. Особенности
Трассировку можно запустить толькопо определенным предикатам
При наличии трассировки не работает
оптимизация хвостовой рекурсии
Установить по умолчанию
недетерминированность предикатов:
Options – Project – Compiler options –
Warnings – Default predicate type –
Nondeterm
8. Константы
CONSTANTSpi=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. Программа «Родственники»
DOMAINSs=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. Бэктрекинг
DOMAINSs=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. Метод отката после неудачи
DOMAINSs=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. Метод отката после неудачи
DOMAINSs=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. Метод отката после неудачи
DOMAINSs=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. Метод отката после неудачи
DOMAINSs=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. Отсечение и откат
DOMAINSs=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.