Практика 1 Пролог

Содержание

Слайд 2

1. Имена в Прологе (Prolog)

1. Имена в Прологе (Prolog)

Слайд 3

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 4

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 5

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 6

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 7

Как это выглядит в Прологе:

Как это выглядит в Прологе:

Слайд 8

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 9

2. Предикаты в Прологе (Prolog)

2. Предикаты в Прологе (Prolog)

Слайд 10

Первая программа

Первая программа

Слайд 12

Поиск братьев и сестер в семье Романовых

Поиск братьев и сестер в семье Романовых

Слайд 13

Поиск братьев и сестер в семье Романовых

Поиск братьев и сестер в семье Романовых

Слайд 14

Задание на закрепление темы прошлого занятия

Суть задания: задаем предикат «нравится» с 2

Задание на закрепление темы прошлого занятия Суть задания: задаем предикат «нравится» с
термами. Они будут означать кому нравится и что нравится.
Далее зададим несколько личностей и их любимые виды спорта.

Слайд 15

Задание на закрепление темы прошлого занятия

Теперь надо ответить на 3 вопроса:
Вопрос1: занимается

Задание на закрепление темы прошлого занятия Теперь надо ответить на 3 вопроса:
ли Юлия Ефимова волейболом? Вопрос требует ответа «да» или «нет».
Вопрос2: Каким видом спорта занимается Елена Ильиных?
Вопрос3: Выведите всех спортсменов, которые занимаются художественной гимнастикой.

Слайд 16

Как следовало выполнить задание:

Как следовало выполнить задание:

Слайд 17

Попробуем создать некое подобие базы данных:

Попробуем создать некое подобие базы данных:

Слайд 18

Теперь будем пробовать задавать разные цели:

Цель1 (дала ответ, что машины марки Toyota

Теперь будем пробовать задавать разные цели: Цель1 (дала ответ, что машины марки
есть).
Цель2 (дала ответ, что машины марки Toyota 2005 года выпуска нет).
Цель3 (дала ответ, какие машины есть в заданном ценовом диапазоне).

Слайд 19

Самостоятельное задание:

Вывести все старые машины (старше 2003 года), создав для этого специальный

Самостоятельное задание: Вывести все старые машины (старше 2003 года), создав для этого
предикат old_mashins.
Вывести все машины нужного цвета, создав специальный предикат color(string).
Вывести, какие есть машины для девушек (чтобы цвет был не белый, не черный и объем не более 1.5 л)

Слайд 20

Самостоятельное задание

Известны высказывания о том, что хорошо, что плохо. Например, иметь квартиру

Самостоятельное задание Известны высказывания о том, что хорошо, что плохо. Например, иметь
хорошо, детей - хорошо, а долги - плохо. Выведите все вещи, которые указаны в базе, как те, которые иметь хорошо.

Слайд 21

Решение самостоятельной задачи

Решение самостоятельной задачи

Слайд 22

Задача 1: Нахождение корней уравнения ax2+bx+c=0

Задача 1: Нахождение корней уравнения ax2+bx+c=0

Слайд 23

Задача 2: Запутанные суждения

Бутси – коричневая кошка. Корни – черная кошка. Мак

Задача 2: Запутанные суждения Бутси – коричневая кошка. Корни – черная кошка.
– рыжая кошка. Флэш, Ровер, Спот – собаки, Ровер – рыжая, а Спот – белая. Все животные, которыми владеют Том и Кейт, имеют родословные. Том владеет всеми черными и коричневыми животными, а Кейт владеет всеми собаками небелого цвета, которые не являются собственностью Тома. Алан владеет Мак, если Кейт не владеет Бутси и если Спот не имеет родословной. Флэш – пятнистая собака. Определить, какие животные не имеют хозяев.

Слайд 25

Построение системы утверждений

Построение системы утверждений

Слайд 26

Задача3: перевозка через реку волка, козы и капусты

Крестьянин должен перевезти в лодке

Задача3: перевозка через реку волка, козы и капусты Крестьянин должен перевезти в
через реку волка, козу и капусту. Вместе с человеком в лодке может поместиться или волк, или коза, или капуста, причем человеку приходится охранять козу от волка и капусту от козы. 

Слайд 27

Решение задачи 3

Решение задачи 3

Слайд 28

Задача 4: вычисление факториала. 0!=1 1!=1 n!=1*2*3*…*(n-1)*n=(n-1)!*n

Задача 4: вычисление факториала. 0!=1 1!=1 n!=1*2*3*…*(n-1)*n=(n-1)!*n

Слайд 29

СПИСКИ в прологе

Указываются через запятую в квадратных скобках:
Чтобы объявить список, надо

СПИСКИ в прологе Указываются через запятую в квадратных скобках: Чтобы объявить список, надо

Слайд 30

Голова и хвост списка

Голова и хвост списка

Слайд 31

Как вывести все элементы списка

Как вывести все элементы списка

Слайд 32

Подсчет количества элементов списка:

Подсчет количества элементов списка:

Слайд 33

Получение нового списка из известного по правилу:

Получение нового списка из известного по правилу:

Слайд 34

Самостоятельное задание

Выведите новый список, который будет содержать все значения конкретного списка, удовлетворяющие

Самостоятельное задание Выведите новый список, который будет содержать все значения конкретного списка,
какому-либо условию. Например, содержать только положительные элементы старого списка.

Слайд 35

Объединение списков

Объединение списков

Слайд 36

Встроенный предикат findall

Встроенный предикат использует целевые утверждения в качестве одного из своих

Встроенный предикат findall Встроенный предикат использует целевые утверждения в качестве одного из
аргументов и собирает все решения для этого целевого утверждения в единый список. У предиката findall три аргумента:
varName(имя переменной) - определяет параметр, который необходимо собрать в список;
myPredicate (мой предикат) - определяет предикат, из которого надо собрать значения;
ListParam (список параметров) - содержит список значений, собранных методом поиска с возвратом. Заметьте, что должен быть определенный пользователем тип, которому принадлежат значения ListParam.

Слайд 37

Определение среднего возраста группы людей

Определение среднего возраста группы людей

Слайд 38

Создание окон

 makewindow(<номер окна>, <атрибуты окна>, <атрибуты рамки>, <заголовок окна>, <начальный номер строки>,    

Создание окон makewindow( , , , , , , , ).
<начальный номер столбца>, <высота окна>, <ширина окна>).

Слайд 39

Цвет текста и фона

Цвет текста и фона

Слайд 40

Цвет рамки окна

Цвет рамки окна

Слайд 41

Размер и положение окна

Определение размеров и положения окон. Аргумент начальный номер строки предиката makewindow есть

Размер и положение окна Определение размеров и положения окон. Аргумент начальный номер
целое число, определяющее верхнюю строку (линию) создаваемого окна. Максимальное количество строк, умещающихся на экране, 25. Значение 4 указывает, что окно начинается с четвертой строки. Для рассматриваемого аргумента можно использовать значения от 0 до 24.
    Аргумент Начальный номер cтолбца предиката makewindow есть целое число, указывающее крайний левый столбец окна. Максимальное число столбцов, умещающихся на экране, 80 (от 0 до 79).
    Аргумент Высота окна есть целое число, определяющее количество строк, занимаемых создаваемым окном. Максимально возможное значение аргумента 25.
    Аргумент Ширина окна есть целое число, указывающее число столбцов, занимаемых окном. Максимальное значение аргумента 80.

Слайд 42

Как в прологе вывести окно

Как в прологе вывести окно

Слайд 43

Самостоятельное задание

makewindow(1,7,7,"Полный экран",0,0,25,80) - данному окну присвоен номер 1. Символы в нем будут

Самостоятельное задание makewindow(1,7,7,"Полный экран",0,0,25,80) - данному окну присвоен номер 1. Символы в
белые, фон черный, рамка белая и метка окна - "Полный экран". Верхний левый угол окна находится на строке 0, столбце 0, а само окно имеет 25 строк и 80 столбцов;
makewindow(2,4,1,"Меню",4,20,16,40) - этому окну присвоен номер 2. Оно имеет метку "Меню". Символы в нем красные на черном фоне, и ограничено оно синей рамкой. Окно начинается с 4-й строки и 20-го столбца, имеет 16 строк и 40 столбцов.

Слайд 44

Предикаты для работы с окнами:

Предикат shiftwindow используется для смены текущего окна (переключения). Его форма:   
shiftwindow(<номер

Предикаты для работы с окнами: Предикат shiftwindow используется для смены текущего окна
окна>)
    Параметр номер окна является целым числом, приписываемым окну при его создании. Например, задание предиката shiftwindow(3) вызывает переназначение всех операций ввода и вывода в окно, с номером 3.
Предикат gotowindow позволяет выполнять быстрое переключение между двумя окнами, которые не перекрываются. Его форма:   
 gotowindow(<номер окна>)
    Этот предикат выполняется быстрее, чем shiftwindow, и поэтому его следует использовать для переключения между окнами, содержащими большое количество текста.
Предикат clearwindow удаляет из текущего окна все текстовые и графические изображения. Предикат не имеет аргументов:  
 clearwindow
   Окно и рамка окна, если она имеется, не разрушаются. Окно целиком закрашивается соответствующим цветом фона.
Предикат removewindow удаляет текущее окно с экрана. Предикат аргументов не имеет, поэтому его синтаксис прост:   
removewindow
    Все текстовые и графические изображения, находящиеся в окне, также удаляются. Если за данным окном находится другое окно, то это окно и его содержимое становятся видимыми. Если удаляется последнее из заданных окон, на экране появляется то изображение, которое было на нем до создания окон.

Слайд 45

Установка курсора в окне

По умолчанию предполагается, что курсор расположен в верхнем левом

Установка курсора в окне По умолчанию предполагается, что курсор расположен в верхнем
углу окна. Однако можно использовать предикат cursor и помещать курсор в любую позицию текущего окна. Этот предикат имеет вид:
cursor(<номер строки>,<номер столбца>).
    Аргументы предиката являются целыми числами, задающими номера строки и столбца, по отношению к верхней строке и крайнему левому столбцу экрана. Строки и столбцы нумеруются, начиная с нуля: предикат cursor(0,0)обеспечивает вывод текста, начиная с верхнего левого угла экрана. Если случайно указывается позиция курсора, выходящая за рамки текущего окна, то во время выполнения программы будет выдано сообщение об ошибке.

Слайд 46

Пример вывода сообщений

Пример вывода сообщений

Слайд 47

Создание перекрывающихся окон

Создание перекрывающихся окон

Слайд 48

Создание меню с помощью окон

Создание меню с помощью окон

Слайд 49

Создание меню с помощью окон

Создание меню с помощью окон

Слайд 50

Файловая система в Прологе

Пролог использует:
 current_readdevice (текущее устройство чтения), с которого считывается ввод;
current_write_device (текущее устройство записи),

Файловая система в Прологе Пролог использует: current_readdevice (текущее устройство чтения), с которого
на которое посылается вывод.
Как правило, текущим устройством чтения является клавиатура, а текущим устройством записи - экран дисплея.
Однако можно и назначить другие устройства. Например, ввод может читаться из файла, хранимого во внешней памяти (возможно, на диске).
Можно даже переопределить устройства текущего ввода и вывода во время исполнения программы.

Слайд 51

Доступ к файлу

Для доступа к файлу надо сначала его открыть. Файл может

Доступ к файлу Для доступа к файлу надо сначала его открыть. Файл
быть открыт:
для чтения;
для записи;
для добавления;
для модификации.
Файл открытый для любого действия, отличного от чтения, должен быть закрыт после завершения операции.
В противном случае внесенные в файл изменения могут быть потеряны. Можно открыть несколько файлов одновременно. При этом и ввод вывод могут быть быстро переназначены между открытыми файлами. Открытие и закрытие файлов занимает намного больше времени, чем переназначение потоков данных между ними.

Слайд 52

Описание файла

Когда Пролог открывает файл, он связывает символическое имя с действительным именем файла операционной

Описание файла Когда Пролог открывает файл, он связывает символическое имя с действительным
системы и использует это символическое имя для направления ввода и вывода.
Символические имена файлов должны начинаться с маленькой буквы и должны быть объявлены в описании домена file. Например:
file=file1; source; auxiliary; somethingElse
В любой программе разрешен только один домен file. 

Слайд 53

Альтернативы file

Пролог распознает пять встроенных альтернатив file, описанных в таблице:
Эти встроенные альтернативы не должны

Альтернативы file Пролог распознает пять встроенных альтернатив file, описанных в таблице: Эти
встречаться в описании file. Открывать и закрывать их не требуется.

Слайд 54

Путь к файлу в Прологе

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

Путь к файлу в Прологе Во время открытия файла необходимо помнить, что
слэш (\), используемый для указания подкаталога диска, в DOS-ориентированных версиях Пролога является ESC-символом (управляющим).
Поэтому при указании пути доступа файла в программе нужно всегда указывать два обратных слэша (\\).    Например, строка:
    "с:\\prolog\\include\\iodecl.con"    представляет путь доступа к файлу:
    с:\prolog\include\iodecl.con

Слайд 55

Предикат openread/2

Предикат openread открывает файл OSFileName дли чтения, используя формат:
openread(SymbolicFileName,OSFileName) % (i, i)
    Пролог обращается к открытому

Предикат openread/2 Предикат openread открывает файл OSFileName дли чтения, используя формат: openread(SymbolicFileName,OSFileName)
файлу по символическому имени SymbolicFileName, объявленному в домене file. Если файл не может быть открыт, Пролог выдаст сообщение об ошибке.

Слайд 56

Предикат openwrite/2

Предикат openwrite открывает файл OSFileName для записи, используя формат:
openwrite(SymbolicFileName,OSFileName) % (i,i)
    Если файл уже

Предикат openwrite/2 Предикат openwrite открывает файл OSFileName для записи, используя формат: openwrite(SymbolicFileName,OSFileName)
существует, то он уничтожается. В противном случае Пролог создает новый файл и помещает его в соответствующем каталоге. Если файл не может быть создан, Пролог выдаст сообщение об ошибке.

Слайд 57

Предикат openappend/2

Предикат openappend открывает файл OSFileName для записи в конец файла. При этом используется формат:
openappend(SymbolicFileName,OSFileName) %

Предикат openappend/2 Предикат openappend открывает файл OSFileName для записи в конец файла.
(i,i)
Если файл не может быть открыт на запись, Пролог сообщит об ошибке.

Слайд 58

Предикат openmodify/2

Предикат openmodify открывает файл OSFileName и для записи, и для чтения; если файл уже существует,

Предикат openmodify/2 Предикат openmodify открывает файл OSFileName и для записи, и для
он не будет перезаписан, openmodify имеет формат:
openmodify(SymbolicFileName,OSFileName) % (i,i)
    Если система не может открыть OSFileName, Пролог сообщит об ошибке. Для заполнения файла с произвольным доступом предикат openmodify может использоваться вместе со стандартным предикатом filepos.

Слайд 59

Предикат filemode/2

При открытии файла в текстовом режиме предикат filemode устанавливает указанный файл в текстовый

Предикат filemode/2 При открытии файла в текстовом режиме предикат filemode устанавливает указанный
или двоичный режим, используя формат:
filemode(SymbolicFileName,FileMode) % (i,i)
    Если FileMode=0, файл SymbolicFileName устанавливается в двоичный режим; если FileMode=1, то он устанавливается в текстовый режим.
    В текстовом режиме при записи к новым строкам добавляются символы "возврат каретки"\"перевод строки", а при чтении эта пара символов интерпретируется как новая строка.
    Carriage return (возврат каретки) = ASCII 13     Line feed (перевод строки) = ASCII 10
    В двоичном режиме никаких преобразований не производится. Для чтения двоичного файла вы можете использовать только предикат readchar или предикаты для доступа к двоичным файлам.

Слайд 60

Предикат closefile/1

Предикат closefile закрывает указанный файл; он использует формат:
closefile(SymbollcFileName) % (i)
    Этот предикат

Предикат closefile/1 Предикат closefile закрывает указанный файл; он использует формат: closefile(SymbollcFileName) %
всегда завершается успешно, даже если файл не был открытым.

Слайд 61

Предикат readdevice/1

Предикат readdevice переопределяет current_read_device (текущее устройство чтения) или возвращает его имя. Предикат имеет формат:
readdevice(SymbolicFileName) %

Предикат readdevice/1 Предикат readdevice переопределяет current_read_device (текущее устройство чтения) или возвращает его
(i), (о)
    Предикат readdevice переопределяет текущее устройство чтения, если переменная SymbolicFileName определена, и файл открыт для чтения. Если SymbolicFileName является свободной переменной, то readdevice присвоит ей имя текущего активного устройства чтения.

Слайд 62

Предикат writedevice/1

Предикат writedevice либо назначает, либо позволяет получить имя current_ write_device (текущего устройства записи). Он имеет

Предикат writedevice/1 Предикат writedevice либо назначает, либо позволяет получить имя current_ write_device
формат:
writedevice(SymbolicFileName) % (i), (о)
    Предикат writedevice переопределит устройство записи, если указанный файл открыт для записи или добавления. Если переменная SymbolicFileName свободна, writedevice присвоит ей имя текущего активного устройства записи.

Слайд 63

Пример работы с файлом

Программа помещает символы, набранные на клавиатуре, в файл TRYFILE.ONE на текущем

Пример работы с файлом Программа помещает символы, набранные на клавиатуре, в файл
диске, использует стандартные предикаты read и write. Набираемые символы не выводятся на экран дисплея. Файл закрывается при нажатии клавиши #.

Слайд 64

Самостоятельное задание 1: допишите программу, чтобы она выводила эти символы и в

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

Слайд 65

Переопределение стандартного ввода-вывода

 Домен file имеет три дополнительные опции: stdin, stdout, stderr. Преимущество этих файловых потоков

Переопределение стандартного ввода-вывода Домен file имеет три дополнительные опции: stdin, stdout, stderr.
в том, что вы можете переназначить стандартный ввод/вывод в командной строке.

Слайд 66

Предикаты работы со строками

Предикаты работы со строками

Слайд 67

Предикат filepos

Предикат filepos может управлять позицией, где производится чтение или запись. Он имеет формат:
filepos(SymbolicFileName,FilePosition,Mode)

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

    Если FilePosition - связанная переменная, предикат может изменить позицию чтения и записи для файла с именем SymbolicFileName. Если при вызове FilePosition является свободной переменной, то SymbolicFileName возвращает текущую позицию в файле.
    Mode является целой величиной и указывает, как должно интерпретироваться значение FilePosition.
Когда возвращается FilePosition, то filepos возвращает позицию относительно начала файла независимо от значения Mode.

Слайд 68

Предикат eof/1

Предикат eof проверяет, является ли позиция, полученная в процессе чтения, концом файла. В

Предикат eof/1 Предикат eof проверяет, является ли позиция, полученная в процессе чтения,
этом случае eof успешен. В противном случае он терпит неуспех. Предикат eof имеет вид:
eof(SymbolicFileName) % (i)
eof выдает ошибку во время выполнения, если файл был открыт с правами только на запись.
Пример, как предикат eof можно использовать для определения предиката repfile, который полезен при работе с файлами, repfile генерирует точку возврата до тех пока не будет достигнут конец файла.

Слайд 69

Задача 1: символы из одного файла переписать в другой файл, заменив их

Задача 1: символы из одного файла переписать в другой файл, заменив их
все на такие же, но заглавные.

Слайд 70

Предикат  flush/1

Предикат flush записывает содержимое внутреннего буфера в именованный файл.
Он имеет формат.
flush(SymbolicFileName) %

Предикат flush/1 Предикат flush записывает содержимое внутреннего буфера в именованный файл. Он
(i)

Слайд 71

Предикат  existfile/1

Предикат existfile выполняется успешно, если файл OSFileName будет найден. Формат его следующий:
existfile(OSFileName) % (i)
   

Предикат existfile/1 Предикат existfile выполняется успешно, если файл OSFileName будет найден. Формат
Предикат OSFileName может содержать каталог, а само имя может содержать знаки подстановки, как c:\psys\*.cfg. Предикат existfile завершается неуспешно, если имя файла не найдено в обозначенном пути каталога. Однако, заметьте, несмотря на то, что existfile находит все файлы, включая файлы с установленными атрибутами "system" (Системный) и "hidden" (Скрытый), он не находит каталоги.
    Для проверки того, что файл присутствует на диске (прежде чем открывать его), вы можете воспользоваться:

Слайд 72

Предикат  deletefile/1

Предикат deletefile удаляет файл, заданный его аргументом, и имеет формат:
deletefile(OSFileName) % (i)
   

Предикат deletefile/1 Предикат deletefile удаляет файл, заданный его аргументом, и имеет формат:
Предикат deletefile даст ошибку, если не сможет удалить файл. 

Слайд 73

Предикат  renamefile/1

Предикат renamefile переименовывает файл с именем OldOSFileName в NewOSFileName.
Он имеет формат:
renamefile(OldOSFileName, NewOSFileName) %(i,i)

Предикат renamefile/1 Предикат renamefile переименовывает файл с именем OldOSFileName в NewOSFileName. Он

    Предикат renamefile будет успешен, если файл с именем NewOSFileName не существует, и оба имени являются допустимыми файловыми именами. В противном случае будет выдана ошибка.

Слайд 74

Предикат  disk/1

Предикат disk используется для изменения текущего диска и/или каталога/подкаталога и имеет формат:
disk(Path) %(i),(о)

Предикат disk/1 Предикат disk используется для изменения текущего диска и/или каталога/подкаталога и

    При вызове со свободной переменной в качестве параметра, disk возвратит текущий каталог. 

Слайд 75

Предикат  frontchar/3

 Предикат frontchar действует согласно равенству:
    String1 = объединение Char и String2
и имеет следующий формат:
frontchar(String1,Char,String2)
Предикат frontchar имеет три

Предикат frontchar/3 Предикат frontchar действует согласно равенству: String1 = объединение Char и
аргумента: первый из них - строка, второй - симвoл (первый символ первой строки), третий - остаток первой строки.
    Предикат frontchar можно использовать для расщепления строки в последовательность символов или для создания строки из последовательности символов, а также проверки символов в строке. Если аргумент String1 связан со строкой нулевой длины, то предикат завершается неуспешно.

Слайд 76

Задача 2: преобразовать строку в список символов.

Задача 2: преобразовать строку в список символов.

Слайд 77

Предикат  fronttoken/3

Предикат fronttoken выполняет три взаимосвязанные функции, в зависимости от типа аргументов, который используется

Предикат fronttoken/3 Предикат fronttoken выполняет три взаимосвязанные функции, в зависимости от типа
для обращения к нему.
fronttoken(String1,Token,Rest) %(i,о,о) (i,i,о) (i,o,i) (i,i,i) (o,i,i)
    В случае потока (i,o,o) fronttoken находит первую лексему в String1, связывает ее с Token, а остаток String1связывает с Rest. Варианты потока (i,i,o), (i,o,i), а также (i, i, i) служат для проверки: если связанные аргументы соответствуют частям String1 (первой лексеме, всему, что находится после первой лексемы, или же и тому и другому), то fronttoken завершается успешно, в противном случае - неуспешно.
    В случае если использован поток (о,i,i), предикат создает объединение Token и Rest, связывая String1 с результатом.
    Последовательность знаков является лексемой, если она представляет собой:
имя в соответствии с синтаксисом Пролога;
число (предшествующий ему знак является отдельной лексемой);
отличный от пробела знак.
    Предикат fronttoken отлично приспособлен для разбиения строки на лексические символы.

Слайд 78

Задача 3: разбить предложение на список слов.

Задача 3: разбить предложение на список слов.

Слайд 79

Предикат  frontstr/4

Предикат frontstr расщепляет String1 на две части. Синтаксис предиката:
frontstr(NumberOfChars,String1,StartStr,EndStr) % (i,i,o,o)
где StartStr содержит NumberOfChars первых символов из String1, a EndStr содержит

Предикат frontstr/4 Предикат frontstr расщепляет String1 на две части. Синтаксис предиката: frontstr(NumberOfChars,String1,StartStr,EndStr)
остаток. При обращении к frontstr первые два параметра должны быть связанными, а последние два - свободными.

Слайд 80

Предикат  concat/3

Предикат concat устанавливает, что строка String3 является результатом сцепления String1 и String2. Он имеет форму:
concat(String1,Sring2,String3) % (i,i,o), (i,o,i),

Предикат concat/3 Предикат concat устанавливает, что строка String3 является результатом сцепления String1
(o,i,i), (i,i,i)
    По крайней мере два параметра должны быть связаны перед тем, как вы вызываете concat; это означает, что этот предикат всегда дает только одно решение (другими словами, он - детерминированный). Например, мы вызываем
concat("croco","dile",In_a_while)
связывая In_a_while с crocodile. 

Слайд 81

Предикат  str_len/2

Предикат str_len решает следующие задачи: определяет или проверяет длину строки или возвращает строку

Предикат str_len/2 Предикат str_len решает следующие задачи: определяет или проверяет длину строки
пробелов заданной длины. Он имеет формат:
str_len(StringArg,Length) % (i,o), (i,i), (o,i)
    Предикат str_len связывает переменную Length с длиной строки StringArg или проверяет, имеет ли StringArgданную длину Length. Length - это беззнаковое целое. В версии предиката с третьим потоком str_len возвращает строку пробелов данной длины, что может быть использовано для распределения буферов и других операций.

Слайд 82

Предикат  isname/1

Предикат isname проверяет, является ли аргумент допустимым именем согласно синтаксису Пролога, и имеет формат:
isname(String)

Предикат isname/1 Предикат isname проверяет, является ли аргумент допустимым именем согласно синтаксису
% (i)
    Имя начинается с буквы алфавита или символа подчеркивания, за которым следует любое число букв, цифр и символов подчеркивания. Предыдущие и последующие пробелы игнорируются.

Слайд 83

Предикаты преобразования типов

Предикаты преобразования типов

Слайд 84

Предикат  char_int/2

 Предикат char_int преобразует символ в целое число или целое в символ и имеет

Предикат char_int/2 Предикат char_int преобразует символ в целое число или целое в
формат:
char_int(Char,Integer) % (i,o), (o,i), (i,i)
    Если оба аргумента связаны, то char_int проверяет, соответствуют ли значения аргументов. Если один аргумент связан, а другой свободен, char_int выполняет преобразование и связывает выходной параметр с преобразованной формой входной параметра.

Слайд 85

Предикат  str_char/2

Предикат str_char преобразует строку, содержащую один и только один символ, в символ или

Предикат str_char/2 Предикат str_char преобразует строку, содержащую один и только один символ,
символ в строку из одного символа; предикат имеет формат:
str_char(String,Char) % (i,o), (o,i), (i,i)
    В случае если поток параметров - (i,i), то предикат str_char завершается успешно, если при этом String связан со строкой из одного символа, который соответствует Char. Если длина строки - не единица, то str_char завершается неуспешно.

Слайд 86

Предикат  str_int/2

Предикат str_int преобразует строку, содержащую целое число, в его текстовое представление и имеет

Предикат str_int/2 Предикат str_int преобразует строку, содержащую целое число, в его текстовое
формат:
str_int(String,Integer) % (i,o), (o,i), (i,i)
    В случае если поток параметров - (i,i), то str_int завершается успешно, при условии, что Integer связан с целым эквивалентом числа, представленного с помощью String.

Слайд 87

Предикат  str_real/2

Предикат str_real преобразует строку в вещественное число или вещественное число в строку и

Предикат str_real/2 Предикат str_real преобразует строку в вещественное число или вещественное число
имеет формат:
str_real(String,Real) % (i,o), (o,i), (i,i)
    В случае если поток параметров - (i,i), то str_real завершается успешно, если Real связан с вещественным числом, равным числу, представленному в String.

Слайд 88

Предикат  upper_lower/2

Предикат upper_lower преобразует строку, все символы (или часть символов) которой являются символами верхнего

Предикат upper_lower/2 Предикат upper_lower преобразует строку, все символы (или часть символов) которой
регистра, в строку соответствующих символов нижнего регистра, и наоборот. Формат предиката:
upper_lower(Upper,Lower) % (i,o), (o,i), (i,i)

Слайд 89

Задача 4: определить предикат scanner, который преобразует строку в список лексем. Лексемы классифицируются

Задача 4: определить предикат scanner, который преобразует строку в список лексем. Лексемы
с помощью связывания функтора с каждой лексемой. В этом примере используются предикаты isname, str_int, str_char для определения природы лексемы, полученной с помощью fronttoken.

Слайд 91

Динамическая база фактов

Динамическая база фактов

Слайд 92

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

Внутренняя база фактов состоит из фактов, которые вы можете непосредственно добавлять и
удалять из вашей программы на Прологе во время ее исполнения. Вы можете объявлять предикаты, описывающие внутреннюю базу данных в разделе database программы и применять эти предикаты таким же образом, как используются предикаты, описанные в разделе predicates.
    Для добавления новых фактов в базу данных в Прологе используются предикаты insert, asserta, assertz, а предикаты retract и retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы фактов, сначалa удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикаты consult/1 и consult/2 считывают факты из файла и добавляют их к внутренней базе данных, a save/1 и save/2 сохраняют содержимое внутренней базы фактов в файле.
    Пролог интерпретирует факты, принадлежащие к базе данных, таким же образом, как обычные предикаты. Факты предикатов внутренней базы фактов хранятся в таблице, которую можно легко изменять, тогда как обычные предикаты для достижения максимальной скорости компилируются в двоичный код.

Слайд 93

Объявление внутренней базы фактов

Ключевое слово database определяет начало объявления раздела database. Раздел database состоит из последовательности объявлений

Объявление внутренней базы фактов Ключевое слово database определяет начало объявления раздела database.
предикатов, описывающих соответствующую внутреннюю базу фактов.

Слайд 94

Доступ к внутренней базе фактов

Предикаты, принадлежащие внутренней базе фактов, доступны точно так

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

Слайд 95

Пример использования базы

Пример использования базы

Слайд 96

Удаление фактов во время выполнения программы

Предикат retract унифицирует факты и удаляет их из внутренней

Удаление фактов во время выполнения программы Предикат retract унифицирует факты и удаляет
базы фактов. Он имеет следующий формат:
retract(the fact) % (i)
retract(the fact,databaseName) % (i,i)
Предикат retract удаляет первый факт из базы данных, который совпадает с фактом the fact.

Слайд 97

Удаление нескольких фактов сразу

Предикат retractall удаляет из вашей базы фактов все факты, сопадающие с

Удаление нескольких фактов сразу Предикат retractall удаляет из вашей базы фактов все
образцом the fact. Предикат retractallимеет следующий формат:
retractall(the fact)
retractall(the fact,databaseName)
Следующая цель удаляет все факты о мужчинах из базы фактов с фактами person:
retractall(person(_,_,_,male)).
    Следующая цель удаляет все факты из базы mydatabase.
retractall(_,mydatabase).

Слайд 98

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

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

Слайд 99

Обратите внимание, какая запись удалилась из базы!

Обратите внимание, какая запись удалилась из базы!

Слайд 100

Задайте указанную цель. Ответьте на вопрос: почему Пролог выдал ошибку?

Задайте указанную цель. Ответьте на вопрос: почему Пролог выдал ошибку?

Слайд 101

Удаление всех записей из базы тех людей, которые любят плавать

Удаление всех записей из базы тех людей, которые любят плавать

Слайд 102

Занесение фактов во время выполнения программы

Во время выполнения факты могут быть добавлены

Занесение фактов во время выполнения программы Во время выполнения факты могут быть
во внутреннюю базу данных фактов посредством предикатов: assert, asserta и assertz, или путем загрузки фактов из файла с помощью consult.
Предикат asserta вставляет новый факт в базу данных фактов перед имеющимися фактами для данного предиката, a assertz вставляет факты после имеющихся фактов данного предиката. Использование предиката assert дает результат, аналогичный использованию assertz.

Слайд 103

Проверка уникальности записи перед ее занесением

Проверка уникальности записи перед ее занесением

Слайд 104

Пример занесения фактов в конец базы данных без проверки уникальности

Пример занесения фактов в конец базы данных без проверки уникальности

Слайд 105

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

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

Слайд 106

Создание своей базы

Мы будем хранить информацию о футболистах.
Программа должна позволять записывать данные

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

Слайд 107

Данные о футболистах

Данные о футболистах

Слайд 108

Описание предиката

Для работы необходим предикат, кодирующий эту информацию. Подходящим является:
player(p_name, /* полное

Описание предиката Для работы необходим предикат, кодирующий эту информацию. Подходящим является: player(p_name,
имя игрока (string) */
t_name, /*название команды (string) */
p_number, /*номер игрока (integer) */
pos, /*позиция игрока (string) */
height, /*рост (string) */ weight, /*
вес (integer) */
nfl_exp) /*стаж выступлений за сборную РФ (integer) */

Слайд 113

Считывание фактов из файла

Предикат consult считывает из файла fileName факты, описанные в разделе database, и вставляет их

Считывание фактов из файла Предикат consult считывает из файла fileName факты, описанные
в вашу программу в конец соответствующей базы фактов. Предикат consult имеет один или два аргумента:

Слайд 114

Создание экспертной системы

Создание экспертной системы

Слайд 115

Определение, является ли лицо отцом по группе крови

Определение, является ли лицо отцом по группе крови