Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник заданий по программированию на языках Лисп, ФРЛ и Пролог.doc
Скачиваний:
53
Добавлен:
28.06.2014
Размер:
226.82 Кб
Скачать

Комната1

 ВЫБЕРИ НАПРАВЛЕНИЕ ДВИЖЕНИЯ (П,Л,В,Н)

Л

 **** ТАКОГО ПУТИ НЕТ ****

В

 КОМНАТА2

 ВЫБЕРИ НАПРАВЛЕНИЕ ДВИЖЕНИЯ (П,Л,В,Н)

. . . . .

 *** ВЫ ВЫШЛИ ИЗ ЛАБИРИНТА ***

 ВАРИАНТ N 5.

1. Реализовать функции  (@FIND   object  list  test)  и  (@FIND-IF

 test  list) , осуществляющие поиск на верхнем уровне в списке list. В

качестве результата возвращается элемент списка list, для которого

(test object element) не NIL. Здесь element - текущий элемент спис-

ка list. Если аргумент test опущен, то test = EQUAL. Для второй

функции предикат test является одноместным.

Примеры: (@FIND 'A '(B CA B C A)) => A

(@FIND 5 '(-10 -5 6 10) '<)) => 6

(@FIND-IF 'MINUSP' (5 10 -3 -4)) => -3

(@FIND-IF 'MINUSP' (5 10 4)) => NIL

- 30 -

2. Реализовать функцию  (@PRINTBLNK  list1  list2) , печатающую

последовательно элементы списка list1, но перед каждым элементом

списка list1 выводится количество пробелов, задаваемое соответству-

ющим числом из списка list2. Если количество элементов в списке

list2 меньше необходимого, то он вновь просматривается сначала.

Пример: (@PRINTBLNK '(A B C (B C D) NIL) '(1 2 3 4))

 A B C (B C D) NIL

T

3. Реализовать функцию  (ANSWER  question) , формирующую ответ на

вопрос по ключевым словам, содержащимся в нем.

Для представления знаний об ответе в ФРЛ можно использовать

фреймы, в которых ответы на вопрос хранятся в аспектах с именем

$VALUE, а список ключевых слов (для идентификации ответа) - в ас-

пектах с именем $DEFAULT. В ПРОЛОГ для этой цели можно использовать

составные объекты.

Проверить работу функции на примере 5-6 наборов ключевых слов.

Пример на ФРЛ:

(DEFRAMEQ

ОТВЕТЫ

(ВОЗРАСТ ($VALUE (20))

($DEFAULT (CKOЛЬКО) (ЛЕТ) (ВОЗРАСТ)) )

(ИМЯ ($VALUE (ЖОРА))

($DEFAULT (КАК) (ЗОВУТ) (ИМЯ)) )

. . . . . .

)

(ANSWER '(КАК ТЕБЯ ЗОВУТ ?)) => ЖОРА

(ANSWER '(СКОЛЬКО ТЕБЕ ЛЕТ ?)) => 20

(ANSWER '(ТЫ ЛЮБИШЬ ДЕТЕКТИВЫ ?)) => НЕ ЗНАЮ

 ВАРИАНТ N 6.

1. Реализовать функции  (@POSITION   object   list   test)  и

 (@POSITION-IF  test list, осуществляющие поиск на верхнем уровне в

списке list. В качестве результата возвращается номер элемента

списка list, для которого (test object element) не NIL. Здесь

element - текущий элемент списка list. Если аргумент test опущен,

то test = EQUAL. Для второй функции предикат test является одно-

местным.

- 31 -

Пример:

(@POSITION '(A B C) '((A)(A B C)(B) D)) => 2

(@POSITION '3 '(5 7 -7 4) '>) => 3

(@POSITION-IF 'MINUSP (1 2 -5 1)) => 3

2. Реализовать функцию  (@PRINTMIXT  list1 list2) , печатающую

последовательно элементы списка list1, но при этом перед каждым

элементом списка list1 выводится соответствующий элемент из списка

list2. Если количество элементов в списке list2 меньше необходимо-

го, то он вновь просматривается сначала.

Пример: (@PRINTMIXT '(1 2 3 4 5 6 7) '(A B C D) )

 A1 B2 C3 D4 A5 B6 C7

T

3. Реализовать функцию управления роботом  (PUT-ON  object1

 object2, позволяющую "переставлять" предмет object1 с текущего

места на предмет object2. Если предмет находится не на поверхности

(т.е. на нем стоит другой предмет), то его переставить нельзя.

При реализации на ФРЛ необходимо использовать присоединенные

процедуры $IF-ADDED и/или $IF-REMOVED, а при реализации на ПРОЛОГ - динамическую базу данных.

Пример на ФРЛ:

(DEFRAMEQ КУБ*2

(НАД ($VALUE (ШАР*3))

($IF-ADDED . . .))

(ПОД ($VALUE (ПИРАМИДА*5))

($IF-REMOVED . . .)) )

. . . . . .

(PUT-ON 'КУБ*2 'БЛОК*1) => NIL

(PUT-ON 'ШАР*3 'БЛОК*1) => T

 ВАРИАНТ N 7.

1. Реализовать функции  (@SUBLIST  list  n  m )  и  (@SUBLIST-IF  list

 n  m  test ), выделяющие из списка list элементы с порядковыми номера-

ми от n до m и возвращающими их в виде результирующего списка. Вто-

рая функция включает в результирующий список лишь те элементы list,

для которых (test element) не NIL. Если test опущен, то включаются

все необходимые элементы.

- 32 -

Пример: (@SUBLIST '(A B C D E F) 3 5) => (C D E)

(@SUBLIST '(A B C D) 4 4) => (D)

(@SUBLIST-IF '(A 1 C 2 E 3) 2 6 'SYMBOLP) => (C E)

2. Реализовать функцию  (@X   list1  list2) , возвращающую список,

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

длины.

Пример: (@X '(A1 A2) '(B1 B2 B3))

((A1 B1) (A2 B1) ... (A1 B3) (A2 B3))

3. Пусть конечный автомат задается множеством фреймов F={F1,

F2, ... FN}, причем каждый Fi имеет вид:

<Fi>::= (Fi

(OUTPUT ($value (<выходное сообщение>)))

(<входное сообщениеi1> ($value (Fi1)))

. . . . . . . . . . . . .

(<входное сообщениеik> ($value (Fik)))

(TERMINATE ($value (<конечная вершина> ...) )

<входное сообщение>::= <атом>

<выходное сообщение>::=<атом>

Написать функцию  (LIFE  begin list ), отображающую поведение ав-

томата с начальной точки begin под действием списка входных сообще-

ний list. Результатом функции должен быть список выходных сообщений

автомата.

 ВАРИАНТ N 8.

1. Реализовать функции  (@SUBSTITUDE   new   old   list   test  ) и

 (@SUBSTITUDE-IF   new test list) , возвращающие в качестве результата

список list, в котором все элементы, для которых (test old element)

не NIL. заменяются на new. Здесь element - текущий элемент списка

list. Если аргумент test опущен, то test = EQUAL. Для второй функ-

ции предикат test является одноместным.

Примеры:

(@SUBSTITUDE 5 2 '(3 4 2 8 5 2)) > (3 4 5 8 5 5)

(@SUBSTITUDE 5 4 '(3 4 2 8 5 2) '>=) => (5 5 5 8 5 5)

(@SUBSTITUDE-IF '0 'MINUSP (3 4 -5 8 -3)) => (3 4 0 8 0)

2. Реализовать функцию  (@LISTFILT  list  test), создающую список

- 33 -

из элементов исходного списка list, включая в него только те эле-

менты списка list, которые удовлетворяют предикату test.

Пример: (@LISTFILT '(A 1 B 2 C 3 D) 'SYMBOLP)

(A B C D)

3. Учащийся сдает экзамены по нескольким предметам. Организо-

вать базу знаний таким образом, чтобы при занесении результата оче-

редного экзамена автоматически рассчитывался текущий средний балл.

При реализации на ФРЛ использовать механизм присоединенных

процедур, а при реализации на ПРОЛОГ - динамическую базу данных.

ВАРИАНТ N 9.

1. Реализовать функции (@MEMBER item list test) и (@MEMBER-IF

test list), осуществляющие поиск в списке list и возвращающие оста-

ток списка list начиная с того элемента, для которого (test item

element) не NIL. Здесь element - текущий элемент списка. Если аргу-

мент test опущен, то test = EQUAL. Для второй функции предикат test

является одноместным.

Пример: (@MEMBER 'A '(B C DD A B A)) => (A B A)

(@MEMBER 5 (3 4 8 1 3) '<) => (8 1 3)

(@MEMBER-IF 'NUMBERP '(A B 3 4 C 5) => (3 4 C 5)

2. Реализовать функцию (@LISTMIXT list1 list2), образующую

список, каждый элемент которого является списком list1 без одного,

двух и т.д. элементов, причем первый элемент заменен на соответс-

твующий элемент списка list2. Если количество элементов в списке

list2 меньше необходимого, то он вновь просматривается сначала.

Пример: (@LISTMIXT '(A B C D) '(1 2 3))

((1 B C D) (2 C D) (3 D) (1))

3. Реализовать функцию  (RETURN-DEBT  who amount , позволяющую

при поступлении наличных денег раздавать долги насколько это воз-

можно. Проверить работу функции на базе знаний о 5 - 6 людях, имею-

щих в том числе и взаимные долги ( возможно, неявные ). При работе

функции долги должны отдаваться всеми до тех пор, пока это возмож-

но.

Пример на ФРЛ:

(DEFRAMEQ

- 34 -

ИВАНОВ

(НАЛИЧНЫЕ ($VALUE (10)))

(ДОЛГИ ($VALUE (ПЕТРОВ)(CИДОРОВ)))

(ПЕТРОB ($VALUE (20)))

(CИДОРОВ ($VALUE (15))) )

. . . . .

(RETURN-DEBT 'ИВАНОВ 15) => T

. . . . .

(FPRINT '(ИВАНОВ))

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 (ИВАНОВ

 (НАЛИЧНЫЕ ($VALUE (0)))

 (ДОЛГИ ($VALUE (СИДОРОВ)))

 (СИДОРОВ ($VALUE (10))) )

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ВАРИАНТ N 10.

1. Реализовать функции  (@CHAR  atom  n )  и  (@FINDCHAR  atom   char n ) . Первая возвращает n-ый символ атома atom, а вторая возвращает

номер позиции первого вхождения char в atom, при этом n задает но-

мер позиции в atom, начиная с которой необходимо выполнять поиск.

Если n опущено, то поиск начинается с начала аtom.

Пример: (@CHAR 'ABCD 3) => C

(@CHAR 'ABC 10) => NIL

(@FINDCHAR 'ABCDEFCD 'D) => 4

(@FINDCHAR 'ABCDEFCD 'D 5) => 6

2. Реализовать функцию  (@INTERSECT  list1 list2) , возвращающую

список list1, в котором оставлены только элементы, входящие в спи-

сок list2.

Пример: (@INTERSECT '(A B C D E) (B D A A))

(A B D)

3. Реализовать базу знаний для родственных отношений. Должны

отслеживаться отношения: отец, мать, сын, дочь, бабушка, дедушка,

муж, жена, внук, внучка, теща, свекровь. Предусмотреть автоматичес-

кую корректировку всех родственных связей при занесении единичной

информации о новом человеке.

- 35 -

 ВАРИАНТ N 11.

1. Реализовать функции  (@FIRSTN   n   list ) и  (@BUTLAST   list n) ,

возвращающие в качестве результата список из n первых элементов

списка list и список без последних n элементов списка list. Если n

задано некорректно, то возвращается пустой список.

Примеры: (@FIRSTN -5 '(A B)) => NIL

(@FIRSTN 2 '(A B C)) => (A B)

(@FIRSTN 3 '(A B)) => (A B)

(@BUTLAST '(A B C D) 2) => (A B)

2. Реализовать функцию  (@PRINTFILT  list test) , печатающую пос-

ледовательно с новой строки только те элементы списка list, которые

удовлетворяют предикату test.

Пример: (@PRINTFILT '(A 1 B 2 C 3 D) 'NUMBERP)

 1

 2

 3

(A 1 B 2 C 3 D)

3. Реализовать диалоговую функцию  (ПОИСК) . Семантика: функция

ПОИСК работает с базой знаний, реализующей фрагмент семантической

сети, описывающей мир животных (для примера взять сеть с 8-10 вер-

шинами). ПОИСК задает вопросы, позволяющие идентифицировать об'екты

в семантической сети по их признакам.

Для представления знаний в ФРЛ следует использовать механизм

наследования по АКО-иерархии, а в ПРОЛОГ - динамическую базу дан-

ных. Предусмотреть возможность занесения новой и удаления старой

информации.

Пример на ФРЛ:

(DEFRAMEQ

*КОРН.ВЕРШ*

(INSTANCE ($VALUE (ПТИЦЫ) (РЫБЫ) ...))

)

(DEFRAMEQ

ПТИЦЫ

(АКО ($VALUE (*КОРН.ВЕРШ*)))

(INSTANCE ($VALUE (ВОДОПЛАВАЮЩИЕ) ...))

- 36 -

(КРЫЛЬЯ($VALUE (ECTЬ))

(ЧЕШУЯ ($VALUE (НЕТ)))

(ТЕМП-ТЕЛА ($VALUE (40)))

(ПОСТОЯН-ТЕМПЕР-ТЕЛА ($VALUE (ДА)))

)

(DEFRAMEQ

ВОДОПЛАВАЮЩИЕ

(АКО ($VALUE (ПТИЦЫ)))

(INSTANCE ($VALUE (УТКА)(ГУСЬ) ...))

. . .

)

(DEFRAMEQ

ГУСЬ

(АКО ($VALUE (ВОДОПЛАВАЮЩИЕ)))

. . .

)

(ПОИСК)

 ТЕМПЕРАТУРА ТЕЛА ПОСТОЯННАЯ? (ДА/НЕТ)

ДА

. . .

 КРЫЛЬЯ ИМЕЮТСЯ? (ДА/НЕТ)

ДА

. . .

 ЭТО - ГУСЬ

 *КОНЕЦ*

 ВАРИАНТ N 12.

1. Реализовать предикат  (@NUM-SORT-P  list test) , который равен

T, если элементы списка list последовательно попарно удовлетворяют

условию test. Если аргумент test опущен, то test = EQUAL.

Пример: (@NUM-SORT-P '(5 2 3/4 7 0 3 -4) '<) => NIL

(@NUM-SORT-P '(-4 0 0.75 2 3 5 7) '<) => T

2. Реализовать функцию  (@CASE-OF  <селектор> <вариант1> ...

 <вариантN> )  - аналог оператора CASE языка Си. Каждый вариант имеет

вид <случай> <форма>, где <случай> ::= <S -выражение>. Сначала вы-

числяется значение селектора. Затем среди вариантов ищется первый,

у которого случай совпал (EQL) со значением селектора. Результатом

- 37 -

функции будет значение соответствующей формы.

3. Реализовать небольшую поисковую систему по вариантам обмена

жилой площадью. На входе такой системы - описание требуемого вари-

анта обмена, на выходе - список подходящих вариантов. Предусмотреть

базу вариантов на 10-15 единиц.

Пример на ФРЛ:

(DEFRAMEQ Вариант-обмена-1

(AKO ($VALUE (Вариант-обмена)))

(число комнат ($value (3)))

(общая-площадь ($require (> :value 35)))

(расположение ($value (центр) or (ст.м.Полежаевская)))

(этаж ($require (> :value 1) (neq :value 'последний)))

...........

)

.

- 38 -

ЛИТЕРАТУРА

1. Уэно Х., Кояма Т. и др. Представление и использование зна-

ний. - М.: Мир, 1989, 220 стр.

2. Семенова Е.Т. Язык программирования ЛИСП 1.5 - М.: МЭИ,

1977, 100 стр.

3. Э.Хювенен, Й.Сеппянен. Мир Лиспа. В 2-х томах - М.: Мир,

1990.

4. Байдун В.В.,Кружилов С.И. и др., Программирование на языке

ЛИСП в системе muLISP-90 - М.: МЭИ, 1994, 40 стр.

5. Семенова Е.Т. Представление знаний в системе LISP/FRL.

- М.: МЭИ, 1987, 104 стр.

6. Байдун В.В., Бунин А.И. и др., Языки и системы представ-

ления знаний ( язык программирования ФРЛ) - М.: МЭИ, 1994, 44 стр.

7. Вагин В.Н., Головко А.В. Язык программирования Турбо-Про-

лог - М.: МЭИ, 1992, 104 стр.

8. Братко И., Программирование на языке ПРОЛОГ для искусст-

венного интеллекта: Пер. с англ. - М.: Мир, 1990, 560 стр.

.

- 39 -

Содержание

ВВЕДЕНИЕ ............................................... 3

1. ЗАДАНИЯ ДЛЯ ПРАКТИЧЕСКИХ ЗАНЯТИЙ ....................... 4

1.1. Задания по языку программирования ЛИСП ............... 4

1.1.1. Рекурсивная обработка числовой информации .......... 4

1.1.2. Рекурсивная обработка списковой информации ........ 5

1.1.3. Конструирующая рекурсия ............................ 7

1.1.4. Последовательные, циклические и итерационные

вычисления ......................................... 8

1.1.5. Функционалы ........................................ 9

1.1.6. Ассоциативные списки и списки свойств ..............10

1.2. Задания по языку программирования ФРЛ ................11

1.2.1. Создание фреймов и извлечение информации из них ....11

1.2.2. Присоединенные процедуры ...........................12

1.2.3. Организация сетей фреймов ..........................14

1.3. Задания по языку программирования ПРОЛОГ .............16

1.3.1. Рекурсивная обработка числовой информации ..........17

1.3.2. Рекурсивная обработка списковой информации ........18

1.3.3. Организация ввода-вывода ...........................19

1.3.4. Динамическая база данных ...........................21

2. ЗАДАНИЯ ДЛЯ ЛАБОРАТОРНЫХ ЗАНЯТИЙ .......................23

2.1. Задания по языку программирования ЛИСП ...............23

2.2. Задания по языку программирования ФРЛ ................23

2.3. Задания по языку программирования ПРОЛОГ .............24

3. ЗАДАНИЯ ДЛЯ КУРСОВОЙ РАБОТЫ ............................25

Литература ................................................38

.

- 40 -

В.В.Байдун, П.Л.Чернов

Методические указания по курсу

Языки и методы программирования

СБОРНИК ЗАДАНИЙ ПО ПРОГРАММИРОВАНИЮ

НА ЯЗЫКАХ ЛИСП, ФРЛ И ПРОЛОГ

(Кафедра Прикладной математики)

Редактор П.Л.Чернов

Редактор издательства

_____________________________________________________________

Темплан издания МЭИ 1996 г.(II), метод.

Подписано к печати

Формат 60x84/16

Физ.печ.л. Уч.-изд.л.

Тираж Изд N Заказ

_____________________________________________________________

Типография Издательства МЭИ, ротапринт, Красноказарменная, 13