Программирование на языке пролог
Шрифт:
Напишите Пролог-программу интерпретации набора продукционных правил. Рассмотрите такие области как определение растений или животных по характерным признакам. Например, подобное правило из ботаники могло бы выглядеть так:
Если растение имеет стебель квадратного сечения, парные листья, двухгубчатые закрытые цветы, а его плод состоит из четырех маленьких орешков, заключенных в кожуру, то это растение принадлежит семейству Labiatae.
Таким образом, если программа спросит нас: «у цветка квадратный стебель?», то ответив «нет» мы тем самым исключаем возможность того, что он принадлежит семейству Labiatae.
12.Написать
13.Написать программу доказательства теорем в исчислении предикатов.
14.Написать программу-«психиатр», которая выдает ответы, основанные на ключевых словах, имеющихся во вводимой информации. Эта программа напоминает ту, что рассматривалась в гл. 3, и которая заменяла ключевые слова в предложении на другие слова. Типичный диалог такой программы мог выглядеть следующим образом (ответы программы выделены курсивом):
What is your problem? На что жалуетесь?
This is too much work. Очень много работы.
What else do you regard as too much work? Что еще вы имеете в виду, говоря, что очень много работы?
Writing letters. Написание писем.
I see. Please continue.Понятно, продолжайте.
Also washing my mother's car. А также мытье машины моей матери.
Tell me more about your family. Расскажите подробнее о вашей семье.
Why should I? Зачем это?
Why should you what? Что зачем?
Здесь ключевыми словами были this is, motherи why.Недостаток подходящих ключевых слов вызывал ответ I see. Please continue.
15.Написать программу, разбирающую предложения с сообщениями о событиях в некотором учреждении, такие как «Smith will be in his office at 3 pm for a meeting.»(Смит будет в своем учреждении в 3 часа дня для участия в собрании). Программа должна выдавать на печать «суть» предложения, сообщая кто, где и когда, следующим образом:
who: smith Кто: Смит
where: office Где: контора
when: 3 pm Когда: 3 часа дня
what: meeting Что: собрание
Эта «суть» должна быть занесена в базу данных в виде утверждений, с тем чтобы можно было получить ответ на такие вопросы:
Where is Smith at 3 pm? Где Смит в 3 часа?
where: office Где: контора
what: meeting Что: собрание
16.Написать интерфейс для общения на естественном (английском) языке с файловой системой вашей ЭВМ, чтобы можно было получать ответы на такие вопросы:
How many files David own? Сколько файлов принадлежат Дейвиду?
Does Chris share PROG.MAC with David? Использует ли Крис файл PROG.MAC совместно с Дейвидом?
When did Bill change file Когда Билл изменил свой VIDEO.C? файл VIDEO.C?
Программа должна уметь опрашивать различные характеристики файловой системы, такие как принадлежность файлов и даты.
ПРИЛОЖЕНИЕ А. ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ
Сюда вошли предлагаемые авторами ответы на некоторые из упражнений, встречающихся в тексте. Для большинства упражнений по программированию редко существует единственный правильный ответ, и, вполне возможно, что у вас получится другой верный ответ, который несколько отличается от предложенного нами. В любом случае следует обязательно опробовать вашу программу на Пролог-системе, имеющейся в вашем распоряжении, чтобы практически проверить, работает она или нет. Но даже в том случае, если вы написали правильную, но отличающуюся от нашей программу, может оказаться поучительным
Упражнение 1.2.Здесь представлены возможные определения семейных отношений.
явл_матерью(М):- мать(М,Ребенок).
явл_отцом(О):- отец(О, Ребенок).
явл_сыном(Сын):- родитель(Род,Сын), Мужчина(Сын).
явл_сестрой(Сес,Ч):- родитель(Род,Сес), родитель(Род,Ч), женщина(Сес), различ(Сес,Ч).
дедушка, (Дед,X):- родитель(Род,Х), отец(Дед,Род).
брат_или_сестра (S1,S2):- родитель(Род,Б1), родитель(Род, S2), различ(S1,S2).
Заметим, что нам приходится использовать предикат различв определении предикатов явл_сестройи брат_или_сестра. Это гарантирует нам, что система не будет считать, что кто-то может быть сестрой или братом самому себе. Дать определение предиката различна этом этапе вы не сможете.
Упражнение 5.2.Следующая программа циклически считывает символы (из текущего файла ввода) и печатает их, заменяя при этом все строчные буквы 'а' на 'b'.
go:- repeat, get0(C), deal_with(C), fail.
deal_with(97):-!, put(98).
deal_with(X):- put(X).
Наличие «отсечения» в первом правиле предиката deal_withсущественно (почему?). Числа 97 и 98 есть значения кодов ASCII для символов ' а' и ' b' соответственно.
Упражнение 6.2.Почему следующее определение предиката getне работает, если целевое утверждение getзадано с конкретизированным аргументом?
get(X):- new_get(X), X›32.
new_get(X):- repeat, getO(X).
Предположим, мы задали Пролог-системе целевое утверждение get(97) (проверить, является ли следующий печатаемый символ строчной буквой 'а'?), тогда как на самом деле этот следующий символ есть ' b'. Чтобы согласовать get(97),делается попытка согласовать new_get(97).Цель repeatуспешно согласуется, но затем цель get0(97)оказывается несогласуемой (так как следующий символ не 'а'). Тогда начинается возвратный ход. Цель get0не может быть повторно согласована, а цель repeat– может. Итак, целевое утверждение repeatснова согласуется с базой данных, и вновь делается попытка согласовать get0(97). На этот раз, конечно, следующим символом будет тот, что следует за ' b'. Если это не ' а', то цель оказывается несогласуемой, a repeatснова завершается успешно. Теперь будет проверяться следующий символ и так далее. Фактически происходит следующее: программа считывает новые и новые символы до тех пор пока она, наконец, не находит тот, что совпадает с аргументом. Но это не то, что должен делать предикат get.Правильное определение предиката get,которое обходит эту проблему, а также содержит «отсечение», устраняющее возможность повторного согласования repeatвыглядит следующим образом:
get(X):- repeat, get0(Y), 32‹Y,!, X-Y.
Упражнение 7.10.Вот программа, которая порождает пифагоровы тройки.
pythag(X,Y,Z):- intriple(X,Y,Z), Sumsq is Х*Х + Y*Y, Sumsq is Z*Z.
intriple(X,Y,Z):- is_integer(Sum), minus(Sum,X,Sum1), minus(Sum1,Y,Z).
minus(Sum,Sum,0).
minus(Sum,Dl,D2):- Sum›0, Suml is Sum-1, minus(Suml,Dl,D3), D2 is D3+1.
is_integer(0).
is_integer(N):- is_integer(N1), N is N1 + 1.
Темный Патриарх Светлого Рода
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
рейтинг книги
Под маской моего мужа
Любовные романы:
современные любовные романы
рейтинг книги
Держать удар
11. Девяностые
Фантастика:
попаданцы
альтернативная история
рейтинг книги
Любовь Носорога
Любовные романы:
современные любовные романы
рейтинг книги
Кодекс Охотника. Книга XXIII
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
![Меняя маски](https://style.bubooker.vip/templ/izobr/no_img2.png)