Написать указанные предикаты на языке Пролог, проверить определения, вызвав предикаты в интерпретаторе с разными аргументами.
1. Определите предикат для печати всех потомков
X,
используя информацию из БД о родственных связях из лабораторной работы №1.
Каждый потомок выводится на отдельной строке с отступом,
соответствующим его дальности родства с
X.
?-потомки('Адам').
Адам
Каин
Сим
...
Авель
2. Определите предикаты для ввода строки текста до точки и
для разбиения предложения на отдельные слова по пробелам.
Слова разделяются одним или несколькими пробелами
?-ввод_строки(L),разбиение(L,R).
Это пример предложения. % вводит пользователь
R=[Это,пример,предложения]
3. Определите предикат для печати арифметического выражения
со скобками, указывающими порядок вычисления выражения.
?-печать(a+b*c/2-3).
((a+((b*c)/2))-3)
4. Определите предикат для печати сложного списка.
Если список не содержит других списков, то выводить его
целиком на одной строке, иначе каждый элемент списка выводить
на отдельной строке.
?-печать_списка([a,[[d,e],f]]).
[
a,
[
[d,e],
f
]
]
5. Пусть имеется набор фактов вида:
словарь(like,нравится).
словарь(fish,рыба).
Определите предикат, выполняющий перевод предложений с
английского языка на русский. В случае неизвестного слова
необходимо делать запрос его значения у пользователя и добавлять
новое определение в словарь.
?-перевод([cat,like,fish],R).
Введите перевод для слова cat: кот.
R=[кот,нравится,рыба]
6. Определите предикат := для вычисления арифметических вычислений,
запоминающий значения вычисленных переменных (обозначаемых атомом Пролога)
и печатающий результат.
?-a:=1.
a=1
?-b:=a*3+5.
b=8
7. Определите предикат листинг(P,A), работающий аналогично
встроенному предикату listing(P/A).
8. Используя сохранение промежуточных результатов в специальном факте,
определите предикат
дети(
X,L) для получения списка детей
X для БД
о родственных связях из лабораторной работы №1.
?-дети('Адам',R).
R=['Каин','Авель']
Напишите предикаты, которые позволят вводить факты вида
X это Y. и отвечать на вопросы
X это Y?? .
Пример диалога:
?-сосна это дерево.
принято
?-дерево это растение.
принято
?-сосна это растение?? .
да
?-береза это растение?? .
неизвестно % один из аргументов отсутствует в БД
?-растение это сосна?? .
нет
10. Напишите предикат для печати структуры в виде дерева.
?-печать(f(g(a,b(x,y)),c(e(f)))).
f
+-g
| +-a
| +-b
| +-x
| +-y
+-c
+-e
+-f
11. Определите предикат для печати арифметического выражения
в обратной польской записи
?-печать(a+b*c/2-3).
a b c * 2 / + 3 -
12. Определите предикат, который вводит из файла input.txt текст
и выводит на сколько раз встречается каждая буква от a до z.
?-ввод.
a 10
c 1
и т.д.
13. Определите предикат для ввода списка целых чисел до символа перехода на
новую строку. Числа разделяются одним или несколькими пробелами.
?-ввод_списка(L).
1 2 3 4 % вводит пользователь
L=[1,2,3,4]
14. Определите предикат, который вводит из файла input.txt текст
и выводит на экран сколько раз встречается каждая цифра 0 от 9.
?-ввод.
0 10
1 43
и т.д.
15. Определите предикат для ввода списка целых чисел до символа перехода на
новую строку. Числа разделяются запятыми.
?-ввод_списка(L).
1,2,3,4 % вводит пользователь
L=[1,2,3,4]
16. Мини-SQL: Таблицы хранятся в виде
имя_отношения(значение_поля1,...,значение_поляN).
описание структуры таблиц хранится в виде
define(имя_отношения, имя_поля, номер, ширина_поля).
Пример:
define(адр_книга,'ФИО',1,30).
define(адр_книга,email,2,20).
define(адр_книга,дата_рожд,3,10).
адр_книга('Иванов И.И.', 'a@a.com', '1/1/1980').
...
Напишите предикат, который извлекает указанные поля из указанной таблицы
и печатает их на экране.
?-select ['ФИО',email] from адр_книга.
Иванов И.И. a@a.com
...
17. Мини-SQL: Таблицы хранятся в виде
имя_отношения(значение_поля1,...,значение_поляN).
описание структуры таблиц хранится в виде
define(имя_отношения, имя_поля, номер, ширина_поля).
Пример:
define(адр_книга,'ФИО',1,30).
define(адр_книга,email,2,20).
define(адр_книга,дата_рожд,3,10).
адр_книга('Иванов И.И.', 'a@a.com', '1/1/1980').
...
Напишите предикат, который печатает на экране строки из указанной таблицы,
удовлетворяющие условию. Условие задается в форме
имя_поля=
значение
?-select адр_книга where 'ФИО'='Иванов И.И.'
адр_книга(Иванов И.И., a@a.com, 1/1/1980).
18. Информация о структуре приборов хранится в виде фактов
содержит(устройство,деталь,кол-во).
Пример:
содержит('сист.блок','блок питания',2).
содержит('блок питания','винт',10).
содержит('сист.блок','винт',6).
Написать предикат, который печатает кол-во деталей в указанном приборе.
?-колво('винт','сист.блок').
сист.блок 6
блок питания 10
ИТОГО 26
19. Определить предикат
display1 (аналог write_canonical) через
write.
?-display1(1+2*3).
+(1,*(2,3))
20. Мини-SQL: Таблицы хранятся в виде
имя_отношения(значение_поля1,...,значение_поляN).
описание структуры таблиц хранится в виде
define(имя_отношения, [имя_поля1/ширина,...,имя_поляN/ширина]).
Пример:
define(адр_книга,['ФИО'/30,email/20,дата_рожд/10]).
адр_книга('Иванов И.И.', 'a@a.com', '1/1/1980').
...
Напишите предикат, который извлекает указанные поля из указанной таблицы
и печатает их на экране.
?-select ['ФИО',email] from адр_книга.
Иванов И.И. a@a.com
...
20. Мини-SQL: Таблицы хранятся в виде
имя_отношения(значение_поля1,...,значение_поляN).
описание структуры таблиц хранится в виде
define(имя_отношения, [имя_поля1/ширина,...,имя_поляN/ширина]).
Пример:
define(адр_книга,['ФИО'/30,email/20,дата_рожд/10]).
адр_книга('Иванов И.И.', 'a@a.com', '1/1/1980').
...
Напишите предикат, который печатает на экране строки из указанной таблицы,
удовлетворяющие условию. Условие задается в форме
имя_поля=
значение
?-select адр_книга where 'ФИО'='Иванов И.И.'
адр_книга(Иванов И.И., a@a.com, 1/1/1980).
22. Определите предикат для печати арифметического выражения
в обратной польской записи
?-печать(a+b*c/2-3).
a b c * 2 / + 3 -
23. Информация о структуре приборов хранится в виде фактов
содержит(устройство,деталь,кол-во).
Пример:
содержит('сист.блок','блок питания',2).
содержит('блок питания','винт',10).
содержит('сист.блок','винт',6).
Написать предикат, который печатает состав прибора, как показано в примере
?-состав('сист.блок').
сист.блок
блок питания 1
винт 10
винт 6
24. Определите предикат для печати всех предков
X,
используя информацию из БД о родственных связях из лабораторной работы №1.
Каждый предок выводится на отдельной строке с отступом,
соответствующим его дальности родства с
X.
?-предки('Алиса').
Алиса
Каин
Адам
Ева
Мария
25. Определите предикат для печати списков в виде S-выражений языка LISP
?-печать([1,[2,3],4]).
(1 (2 3) 4)