- •2.2.2.1 Вызов Турбо-Пролога и главное меню системы
- •2.2.3 Редактор Турбо-Пролога
- •2.2.3.1 Создание и редактирование программного файла
- •3 Лекция №2. Элементы и конструкции языка Турбо-Пролог
- •3.1 Основные вопросы
- •3.2 Текст лекции
- •3.2.1.1 Имена (идентификаторы)
- •3.2.2.1 Предикаты
- •3.2.2.2 Факты
- •3.2.2.3 Правила
- •3.2.2.4 Цели
- •4 Лекция №3. Объекты данных. Константы, переменные, структуры, списки.
- •4.1 Основные вопросы
- •4.2 Текст лекции
- •Стандартные типы доменов Турбо-Пролога
- •4.2.2.1 Константы
- •4.2.2.2 Переменные
- •4.2.2.3 Структуры
- •4.2.2.3 Списки
- •5 Лекция №4. Структура программы на Турбо-Прологе
- •5.1 Основные вопросы
- •5.2 Текст лекции
- •5.2.2 Структура программы на Турбо-Прологе – до 10 мин.
- •5.2.3.1 Раздел опций компилятора
- •5.2.3.2 Раздел констант
- •5.2.3.3 Раздел доменов
- •5.2.3.4 Раздел предикатов
- •5.2.3.5 Раздел утверждений
- •5.2.3.6 Раздел дбд
- •5.2.3.7 Раздел целей
- •6 Лекция №5. Унификация и поиск с возвратом: программа с фактами
- •6.1 Основные вопросы
- •6.2 Текст лекции
- •7 Лекция №6. Унификация и поиск с возвратом: программа с фактами и правилом
- •7.1 Ключевые (основные) вопросы (моменты)
- •7.2 Текст лекции
- •8 Лекция №7. Унификация и поиск с возвратом: программа с фактами и несколькими правилами
- •8.1 Основные вопросы
- •8.2 Текст лекции
- •9 Лекция №8. Вопросно-ответные системы
- •9.1 Основные вопросы
- •9.2 Текст лекции
- •10 Лекция №9. Средства отладки в Турбо-Прологе
- •10.1 Основные вопросы
- •10.2 Текст лекции
- •/*Программа 5 */
- •11 Лекция №10. Простейший ввод-вывод. Окна.
- •11.1 Основные вопросы
- •11.2 Текст лекции
- •11.2.1 Простейший ввод-вывод
- •11.2.2 Окна
- •12 Лекция №11. Управление поиском решений: предикаты отсечения и возврата
- •12.1 Основные вопросы
- •12.2 Текст лекции
- •/* Программа 5 */
- •Vse_reshenia:-roditel(X,y), write(X, "родитель", y), nl, fail.
- •Vita - родитель sasha
- •/* Программа 6 */
- •/* Программа 7 */
- •13 Лекция №12. Арифметика в Турбо-Прологе. Рекурсия.
- •13.1 Основные вопросы
- •13.2 Текст лекции
- •/* Программа 8 */
- •/* Программа 9 */
- •14 Лекция №13. Динамические базы данных
- •14.1 Основные вопросы
- •14.2 Текст лекции
- •/* Программа работы с дбд*/
- •15 Лекция №14. Работа со списками
- •15.1 Основные вопросы
- •15.2 Текст лекции
- •/* Программа 10*/
- •/* Программа 11 */
- •/* Программа 12 */
- •16 Лекция №15. Экспертные системы
- •16.1 Основные вопросы
- •16.2 Текст лекции
- •/* Программа эс*/
Vita - родитель sasha
. . .
Предикат fail можно использовать для сопоставления списков лиц по некоторым общим признакам. Например, предположим, что имеется база данных о студентах, где данные о каждом студенте включают фамилию, пол, номер группы и вид спорта, которым он занимается. Допустим эти данные описываются предикатом student следующим образом:
student(familia, pol, gruppa, vid_sporta)
Рассмотрим теперь программу позволяющую выделить студентов - мужчин занимающихся боксом:
/* Программа 6 */
domains
familia, pol, gruppa, vid_sporta = symbol
predicates
student(familia, pol, gruppa, vid_sporta)
student_boxers
goal
write("Студенты-боксёры"), nl, nl, student_boxers
clauses
student("Александров", "м", "А1", "бокс").
student("Борисова", "ж", "А1", "волейбол").
student("Комарова", "м", "А2", "бокс").
student("Морозова", "ж", "А2", "волейбол").
student("Соколова", "ж", "А1", "баскетбол").
/* Правило составления списков студентов-мужчин боксёров */
student_boxers :- student(Familia, "м", Gruppa, "бокс"),
write(Familia, Gruppa), nl, fail.
Правило для составления списков студентов-боксёров требует, чтобы отбирались те студенты, у которых вторым аргументом предиката student является "м" (т.е. мужской пол), а четвёртым аргументом - "бокс". Предикат fail в конце правила обеспечивает выборку всех студентов отвечающих этим требованиям. В результате выполнения программы будет выведен следующий список:
Студенты-боксёры
Александров, А1
Комаров, А2
То же правило можно записать иначе:
student_boxers :- student(Familia, Pol, Gruppa,
Vid_sporta),
Pol="м", Vid_sporta = "бокс",
write(Familia, Gruppa), nl, fail.
Результат программы в данном случае будет тем же. Аналогично можно построить правила для выборки из этой базы данных по другим признакам. Например правило для составления списка всех студентов-спортсменов группы А1 будет выглядеть следующим образом:
student_sportsmens :- student(Familia, Pol, "А1",
Vid_sporta),
write(Familia), nl, fail.
Это же правило можно записать следующим образом:
student_sportsmens :- student(Familia, Pol, Gruppa,
Vid_sporta),
Gruppa="А1", nl, fail.
Рассмотрим теперь программу, демонстрирующую использование отсечения:
/* Программа 7 */
domains
person = symbol
predicates
roditel(person, person)
viborka
otsechenie(person, person)
clauses
roditel(ola, sasha).
roditel(vita, sasha).
roditel(vita, kata).
roditel(sasha, ana).
roditel(sasha, vera).
roditel(vera, kola).
viborka :- roditel(X,Y), write(" ", X, " ", Y), nl,
otsechenie(X, _), !.
otsechenie (X, _) :- X=sasha.
В разделе goal программы в качестве цели стоит предикат viborka. Сама программа позволяет провести выборку из списка. В процессе достижения цели программа обращается к правилу для предиката viborka.
Как можно видеть, первою подцелью этого правила является запрос "Кто чей родитель?":
roditel(X, Y).
Турбо-Пролог унифицирует эту подцель с первым предложением раздела clauses, т.е. связывает значения переменных X и Y следующим образом:
X = ola, Y = sasha
Далее должен выполняться предикат otsechenie при X = ola. Однако правило для этого предиката требует, чтобы X=sasha. Поэтому достижение цели в данном случае невозможно и Турбо-Пролог осуществляет возврат к следующему факту roditel из раздела clauses.
Унификация связывает теперь переменную X со значением vita (X=vita). Поскольку и в этом случае выполнение предиката otsechenie терпит неудачу, вновь будет осуществлён возврат к новому факту раздела clauses и так до тех пор, пока унификация подцели roditel(X, Y) приведёт наконец к X=sasha. В этом случае будет согласовано и правило для предиката otsechenie. Однако в правиле viborka за предикатом otsechenie следует символ отсечения "!", указывающий, что дальнейший поиск решений не нужен, хотя они и могли быть найдены. Поэтому на выходе мы получим лишь часть списка родителей и детей, а именно:
ola, sasha
vita, sasha
vita, kata
sasha, ana
Таким образом, отсечение cut(!) устанавливает "барьер", запрещающий выполнение возврата за поиском других альтернативных решений текущей подцели. Барьером этим, в данном случае, является первый факт, в котором родителем является sasha.