Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛОИИ методичка 2015.doc
Скачиваний:
52
Добавлен:
12.03.2016
Размер:
194.56 Кб
Скачать
    1. Пример построения базы правил на Пролог

родитель (иван, маша).

родитель (иван, денис).

мужчина (иван).

мужчина (денис).

женщина (маша).

Вопросы системе:

? - родитель (Иван, Маша)

Да

? - родитель (Денис, Маша)

Нет

В вопросах можно использовать переменные.

Кто родитель Маши?

? - родитель (Х, маша)

Х = Иван

Кто дочь Ивана?

? - родитель (иван, Х), женщина (Х)

Х = Маша

Определим отношение ребенок. Используем для его определения переменные:

Если Х – родитель У, то У – ребенок Х.

ребенок (У, Х) :- родитель (Х, У).

    1. Задание на лабораторную работу

  1. Постройте дерево родственных отношений (не менее 4 уровней, не менее 20 человек).

  2. Введите данные о родственных отношениях в программу на Пролог, используя отношения «родитель», «мужчина», «женщина»

  3. Введите в программу правила, описывающие родственные отношения (не менее 10 различных отношений).

  4. Запустите программу через компилятор Пролог

  5. Задайте вопросы системе. Объясните полученные результаты, используя алгоритм работы Пролог-машины.

  1. Лабораторная работа № 2

ИСПОЛЬЗОВАНИЕ СТРУКТУР В ПРОЛОГ

Цель занятия

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

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

1 Изучить правила использования списков, накапливающего параметра, оператора отсечения

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

3 Оформить отчет

4 Ответить на контрольные вопросы

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

1 Текст процедур

2 Результаты выполнения процедур

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

1 Определение списка. Основные операции над списками

2 Преимущества использования накапливающего параметра

3 Точный смысл оператора отсечения

    1. Использование списков в Пролог.

Список можно описать с помощью функтора (а,(b,c)).

Эквивалентная запись [a,b,c]

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

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

1, 2 – исходные списки; 3 – результирующий список.

Базовый случай – если первый список пуст, то 2й и 3й список одинаковы.

Общий случай – если первый список не пуст, то его голова совпадает с головой 3го списка, а хвост 3го списка будет результатом сцепления хвоста первого списка со вторым списком.

append1([],L,L).

append1([H|T1], L, [H|T]):-

append1(T1, L, T).

?- append1([a,b], [c,d], X).

X = [a,b,c,d]

Пример: принадлежность элемента списку:

1 – объект; 2 – список объектов.

Предикат – истина, если в списке встречается искомый объект.

Базовый случай: если элемент совпадает с головой списка, то предикат – истина.

В общем случае нужно проверить принадлежность элемента хвосту.

elem(X, [X|_]).

elem(X, [_|Xs]):- elem(X, Xs).

?- elem(b, [a,b,c]).

Yes

?- elem(d, [a,b,c]).

No

Пример: удаление элемента из списка:

1 - объект, 2 – исходный список; 3 – результирующий список.

Базовый случай: если элемент совпадает с головой списка, то результат – хвост списка.

Общий случай: результатом будет список, имеющий голову исходного списка и хвост – хвост исходного списка, из которого удален заданный элемент.

delete1(X, [X|Xs], Xs).

delete1(X, [X1|Xs], [X1|L]):-

delete1(X, Xs, L).

?- delete1(b, [a,b,c], X).

X = [a,c]

?- delete1(d, [a,b,c], X).

no