Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Вопросы на самостоятельную проработку

  • Будет ли работать программа, представленная в последнем примере, если из нее удалить все предикаты отсечения?

  • Какие действия выполняют предикаты frontchar и nl, использованные в последнем примере?

  • Какие значения получают переменные из шаблонов следующего вида [X | T], [X, Y | Z], если они сопоставляются со списком [a, b, c, d, e]?

  • Имеется объявление предиката g:

domains

lst=symbol*

predicates

g(lst, lst)

clauses

g([],[]).

g([X],[]).

g([X|T],[X|Y]):-not(T=[]), g(T,Y).

goal

g([a, b, c, d, e], L).

Укажите значение переменной L.

  • Имеется следующее объявление предиката t:

domains

lst=symbol*

predicates

t(symbol, lst, lst)

clauses

t(X, [], []).

t(X, [H|T], Y):-X=H, t(X,T,Y).

t(X, [H|T], [H|Y]) :- not(X=H), t(X,T,Y).

Укажите значение переменной L, если секция goal имеет следующий вид:

goal

t(e, [a, b, c, e, d, k, e], L).

К оглавлению

Лекция 5. Динамическая база данных в Турбо-Пролог-программах Составные области

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

Составная_область = функтор1(список_областей1); функтор2(список_областей2);...

Т.о. составная область может объединять несколько различных структур. Списки областей должны включать перечисляемые через запятую базовые домены Пролога или имена производных доменов.

Пример

key = up; down; left; right;str(string)

Домен key включает символы up, down, left, right и произвольные строки.

Пусть в базе данных необходимо разместить данные о студентах некоторой учебной группы. О каждом студенте размещается следующая информация – Ф.И.О., наименование группы, данные о предметах и оценках последней сессии, данные о семье. Эти данные можно представить следующим образом.

domains

fio = fio_stud(string, string, string)

grup = string

par = predm_oz(string, string)

session = par*

data = fio_memb(string, string, string); unmarried

family = data*

lfio = fio*

Применение области lfio будет объяснено в более полном описании примера в дальнейшем.

Поиск в БД можно осуществлять не только по содержимому, но и по структуре элементов.

Пример

Представленные ниже выражения позволяют найти в БД среди фактов stud(…):

  • всех студентов (Ф.И.О.) группы КМ-83 – stud(fio_stud(X, Y, Z),”KM-83”,_,_),

  • всех неженатых студентов группы КМ-84 - stud(Z,”KM-83”,_,_), в данном варианте записи предиката переменной Z будут сопоставляться термы вида fio_stud(…)

Для более гибкого доступа к БД, если необходимо, в раздел клозов можно включить правила следующего вида :

  1. определение группы, в которой учится студент

grup_memb(F, I, O, Gr):- stud(fio_stud(F, I, O), Gr, _, _).

  1. определение отчества студента по фамилии имени и группе

otch(X, Y, Gr, Ot):- stud(fio_stud(X, Y, Ot), Gr,_,_).

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

Наименование-предиката-селектора(объект, выбранная-компонента)

Пример

Ниже представлены следующие образцы селекторов для выделения фамилии студента из тройки fio_stud(X, Y, Z) или выделения первого или последнего предмета в списке пар <предмет, оценка>, соответственно:

clauses

familia(fio_stud(X, _, _), X).

perv_predmVspiske([predm_oz(X, _)| _], X).

posl_predmVspiske([predm_oz(X, _)| T], Y):- T=[], !, Y=X.

posl_predmVspiske([predm_oz(X, _)| T], Y):- posl_predmVspiske(T, Y).

Если требуется БД изменять динамически, то необходимо декларировать те предикаты, которые будут в ней размещаться:

database

имя-предиката (списое-доменов)

…….

В динамической БД можно размещать только факты, но не правила!

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]