Просмотр полной версии : ПЗУ языка Пролог для БК0010
Уважаемые БКшники, прошу поделиться инфой о ПЗУ языка Пролог для БК0010 или БК0010-01.
ПЗУ, вероятно, имеет адрес 140000.
Кто что слыхал на эту тему ?
- - - Добавлено - - -
На днях сдамплю ПЗУшку и выложу в облако Майл.ру, в 100% формате.
Так вроде была уже?
Которая "Пpoлoг-Д 1.0 (C) Copyright 1990 by AW Corp." ?
- - - Добавлено - - -
Только у меня вроде с чипкодом 02 (120000), если я ничего не путаю...
Так вроде была уже?
Если есть возможность, пожалуйста, опубликуйте первые 10 слов и к/с - может это и оно.
У меня , возможно, оригиналы ОКБ Э., не пошедшие в серию как не одобренные.
Ещё бы документацию по этому Прологу добыть... Или там встроенный help?
Мне сейчас нечем КС посчитать. Да и я не дома сейчас ;-)
- - - Добавлено - - -
В том что у меня нет встроенного хелпа. Поэтому я на него и забил давно. Хотя вроде где-то на дискетах была документация. И вроде даже тут пробегала, если я не путаю.
https://pic.maxiol.com/thumbs/1558701842.531453934.0524154120.jpg (https://pic.maxiol.com/?v=1558701842.531453934.0524154120.jpg)
Сдампить вот просто так на БК11М нельзя, т.к. ПЗУ на 140000 адресе.
У Вас новее. Так программатором же можно сдампить....
Сдампить вот просто так на БК11М нельзя, т.к. ПЗУ на 140000 адресе.А из Пролога можно заносить числа в ячейки памяти? Если да, то можно написать небольшой хак, который сохраняет дамп памяти на диск или на магнитофон. Но программатором, конечно, проще. Для тех, у кого он есть :-)
https://cloud.mail.ru/public/jpnX/5BgfoNUjS
140000 адрес для БК0010.
Можете добавлять в диск для модуля ЭСППЗУ.
к/с 161623
Должно работать на БК0010 с СОЗУ в адресе 140000-157777 ( 8 ).
Что и как программировать - не в курсах . У меня на клаве не работают : пробел, СУ, ПР, НР, КТ - т.к. надо менять пленку.
*
Как дампил ?
1. Загрузил программу PRG.SAV
2. Перезапустил БК11М с удержанием клавы.
3. Вставил в колодку на плате ПЗУ "Пролог".
4. Набрал в адресе 10000 ( 8 ) программку, которая включает 12-ю страницу ПЗУ, ждет 10 сек ( в которые надо отключить 324 ПЗУ БК11М - 140000 адрес ), щелкает релешкой, ждет еще 10 сек, и выходит в пульт БК11М.
5. Проверяю в буфере на адресе 20000 - да, дамп скопировался, к/с в норме.
6. Запускаю PRG.SAV с 1000 адреса - программатор поддерживает все платформы, включая ДВК.
7. Провожу п.1 - "чтение с диска дампа", но с отрицательным к-во слов - т.е. записываю на диск дамп из буфера.
8. Небольшое жонгирование диском в эмуле ДВК господина Патрона.
9. Кладу результат в Облако.
Доб.
ПЗУ ( КМ1801РР1 ) сегодня отправятся andy7109
9. Кладу результат в Облако.Переделал в .bin с адреса 140000, на БК-0010-01 с SMK запускается.
На БК-0011М не запускается. Надо добавить небольшой кусочек кода, который переключает страницы нужным образом и добавляет Монитор БК-0010 по адресу 100000.
А из Пролога можно заносить числа в ячейки памяти?
если только там есть какие то самопальные расширения, пролог это язык логического программирования и он ничего не знает про "память"
Добавил в свой FPGA проект ПЗУ пролога на место модуля 3.
А как его запустить из монитора?
Живой БК001Х никогда не было.
Сейчас у меня подключены ПЗУ монитора, фокала, пролога и тесты.
69086
Просёк.
69087
Из монитора <ЛАТ> P <ВК>
Проверил: на БК-0010 с контроллером СМК работает даже чтение и запись на диск.
На БК-0011 не запускается, надо писать отдельный загрузчик. Нужно это кому-нибудь? Запускать Пролог на БК-0011М с СМК.
И да, если кому попадётся документация - киньте плиз.
как понимаю дока по нему вот тут
Григорьев С. Работа системы Пролог-Д //Информатика и образование,1990, №4. С. 41-44.
Григорьев С. Программирование на Прологе-Д //Информатика и образование, 1990, № 5. С. 50-56.
Григорьев С. Графические средства системы Пролог-Д //Информатика и образование, 1990, № 6. С. 47-49.
Григорьев С. Обработка списков на Прологе-Д //Информатика и образование, 1991, № 1. С. 41-42.
Григорьев С. Пролог-Д в ПЗУ БК-0010 //Информатика и образование, 1992, №3-4.-С. 38-39.
Григорьев С., Морозов М. Давайте попробуем Пролог //Информатика и образование, 1987, №4. С. 14-16.
как понимаю дока по нему вот тутА есть ссылки на сканы этих журналов?
А есть ссылки на сканы этих журналов?
неа, нету, как раз за 92й год отсканированных только 1й номер везде лежит только
похоже что 2 и 3 номера в которых ПЗУ описано как раз только в библиотеках
А есть ссылки на сканы этих журналов?
тут есть oldpc.su/lib , там все в процессе допиливания и дополнения, но нужные журналы вроде доступны
тут есть oldpc.su/lib , там все в процессе допиливания и дополнения, но нужные журналы вроде доступны
Григорьев С., Морозов М. Давайте попробуем Пролог //Информатика и образование, 1987, №4. С. 14-16.
Битая ссылка http://oldpc.su/lib/magaz/info/1987_4.djvu
Остальное скачивается, спасибо!
Битая ссылка
Исправил вроде
69090
Начал переводить документацию Пролога-Д в текстовый вид, надеюсь кому-нибудь пригодится.
Начинаю выкладывать документацию Пролога-Д.
"Информатика и образование" №4 1987
Скачать: 69095
С удивлением узнал, что в 1987-ом году Пролог написан на Бейсике... Надеюсь, позже его перевели в коды.
С. Григорьев, М. Морозов
Йошкар-Ола
Давайте попробуем Пролог
О традиционных языках и нетрадиционных задачах
Когда рассматривают круг проблем, связанных с изучением и использованием языков программирования в школе, обычно имеют в виду традиционные языки - Бейсик. Рапиру, Паскаль и т.п. В чем главная особенность этих, так называемых процедурных, языков? В ориентации на вычислительную машину. Процедурные языки развивались как средство записи операций, выполняемых вычислительной машиной, и отражают непривычное для человека «машинное мышление». Такой подход предполагает: чтобы ЭВМ решила задачу, необходимо построить алгоритм, определяющий последовательность действий, и запрограммировать его, а машина, точно следуя по указанному пути, сделает то, что было задумано.
Однако подобный образ действий вне физико-математических дисциплин сталкивается с серьезными трудностями.
Ориентированный на математические расчеты Бейсик малопригоден для отражения предметного мира, скажем, географии, истории, иностранного языка. Даже большие возможности символьной обработки, заложенные в Рапире, оказываются недостаточными.
Есть и другая проблема, возникающая при обучении школьников программированию на традиционных языках: поиск конкретных реальных задач, решать которые удобно, используя программирование.
В вузе вопрос решается просто: студентов заставляют работать с численными методами решения математических задач. В младших классах школы проблему пытаются обойти, вводя исполнителя (например, «черепаху»), действующего как ЭВМ. В старших классах все-таки приходится обращаться к вычислению площадей, решению квадратных, нелинейных и других уравнений.
Но школьникам еще предстоит долгий путь до практического применения этих численных методов! Это произойдет, например, когда в вузе будут изучены математические модели реальных физических процессов. А главное, в развитии и использовании современной вычислительной техники наметился явный отход от вычислений. Вчерашнему школьнику предстоит столкнуться в своей практической деятельности с экспертными системами, системами обеспечения принятий решений, базами знаний и всем тем, что принято называть технологией обработки знаний или искусственным интеллектом. А это потребует и других навыков, и другого, «немашинного», мышления.
Возникает необходимость поиска новых, более адекватных средств общения с компьютерами; здесь нельзя не обратиться к активно развивающемуся сейчас логическому программированию и языку программирования Пролог.
Появившись в начале 70-х гг. в лаборатории искусственного интеллекта в университете г. Марселя, Пролог на протяжении почти десяти лет оставался известен лишь узкому кругу специалистов. Но тот факт, что логическое программирование и сам Пролог были положены в основу японского проекта ЭВМ пятого поколения, привлек к языку всеобщее внимание.
В отличие от традиционных языков, которые нужны для изложения способа решения задачи, на Прологе формулируется только ее постановка. Пользователь должен сообщить ЭВМ необходимые факты и несколько правил, описывающих, как эти факты соотносятся друг с другом, а она из полученной информации сформирует ответ на поставленный вопрос.
В основу Пролога положен сложный математический аппарат логики предикатов первого порядка и теории логического вывода. Однако, чтобы изучить этот язык и работать с ним, нет необходимости вникать в тонкости математической логики, как нет необходимости вникать в принципиальную схему телевизора, прежде чем включить его вечером.
Пролог очень легок для изучения и использования, но, несмотря на это, намного мощнее, чем любой другой язык, используемый в настоящее время на микро-ЭВМ. Часто оказывается, что программа на Прологе почти на порядок короче, чем на процедурном языке программирования.
Против Пролога существует предубеждение, что его эффективная реализация возможна только на больших, мощных ЭВМ. Действительно, в недалеком прошлом это было так, и в СССР Пролог действовал только на ЕС ЭВМ и СМ ЭВМ. Теперь ситуация изменилась. Оказалось, что его можно приспособить для быстрой и эффективной работы на небольших машинах и при этом создать развитые средства программной поддержки, ориентированные на пользователя. Сейчас существует реализация Пролога для всех микро-ЭВМ с операционной системой СР/М, в Институте программных систем АН СССР разработана реализация для микро-ЭВМ «Ямаха».
Эти достижения укрепили позицию Пролога как практичного, простого языка, при годного для использования в школьной информатике. Широкое применение языка такого типа планируется в болгарских школах для изучения гуманитарных наук; реализуется проект «Логика как язык компьютеров для детей». Аналогичные работы проводятся в СССР.
Программа на Прологе-Д
Опишем процесс программирования на упрощенном логическом языке, реализованном авторами и названном Пролог-Д.
В процедурных языках программа состоит из операторов. В совокупности операторы описывают этапы, необходимые для достижения заданной цели. Программа на Прологе-Д состоит из последовательности предложений (фактов и правил), порядок которых значения не имеет. Совокупность фактов и правил называют базой данных.
Вот пример простой программы:
МАМА (НАДЯ, АСЯ); (1)
МАМА (АСЯ, ДАША); (2)
БАБУШКА (А, В)<—МАМА (А, С), МАМА (С, В); (3)
В этой программе предложения (1) и (2) - факты, а предложение (3) - правило. В конце каждого предложения ставится точка с запятой. Факты дают представление об объектах и действиях. Предложение «Надя - мама Аси», записанное в виде факта МАМА (НАДЯ, АСЯ), можно было бы записать и как МАМА (АСЯ, НАДЯ), (исправив при этом (2) на МАМА (ДАША, АСЯ), а в (3) записав БАБУШКА (В, А)).
Важно, чтобы заданная последовательность аргументов сохранялась на всем протяжении программы.
Правило (3) определяет зависимость одних объектов или действий от других и записывается в общем виде так:
СЛЕДСТВИЕ<-ФАКТ 1, ФАКТ 2;
Его можно прочесть так: «Если ФАКТ 1 верен, ФАКТ 2 верен, то СЛЕДСТВИЕ тоже верно». Левая часть правила - СЛЕДСТВИЕ - называется головой, а составляющие правой части - целями.
В программе (1)-(3) имена и слова БАБУШКА, НАДЯ, АСЯ, МАМА, ДАША называются атомами. Атомы - это константы, они не меняют своего значения при выполнении программы. Записываются атомы в виде последовательности букв, цифр и пробелов и начинаются с буквы. Константой является и целое, представляющее собой последовательность цифр.
В правиле (3) А, В, С - переменные. Область действия переменных в Прологе ограничивается одним предложением. Если переменная в голове правила принимает какое-либо значение, то его же она принимает и в целях. Переменные могут обозначаться одной буквой или последовательностью букв (заканчивающейся апострофом или нижним подчеркиванием, когда значение переменной несущественно).
Выражения вида (1) и (2) (в частности, выражение БАБУШКА (А, В)) называются термами.
Программа должна заканчиваться одним или несколькими вопросами. Вопрос записывается как факт, но впереди должен стоять вопросительный знак. Если, например, к программе (1)-(3) добавить вопрос
? БАБУШКА (НАДЯ, А);
то машина ответит:
А=ДАША
Вопрос должен соответствовать ряду условий:
атом, с которого начинается вопрос, должен стоять в голове хотя бы одного из правил базы данных;
вопрос не должен содержать новых атомов и переменных, в противном случае Пролог-Д ответит «не знаю».
На вопрос, не содержащий переменных, программа ответит «да», если в базе данных есть факт, совпадающий с вопросом, или «нет» в противном случае; если вопрос содержит переменные, то будут напечатаны все возможные их значения. Например, на
? МАМА (А, -);
машина ответит
А = НАДЯ
А = АСЯ
Немного о реализации языка
Поиск ответа на вопрос в Прологе-Д осуществляется доказательством теоремы, основанной на логических предложениях, из которых состоит программа. Доказательство осуществляется методом резолюций и основано на алгоритме, предложенном в работе: Sammut R. A., Sammut С. A. Implementation of UNSW-PROLOG // Austr. Comp. Journ. V. 15. P. 57-90 - и отличающемся достаточно высокой эффективностью.
Интерпретатор языка реализован на Бейсике для ДВК-2 и занимает 8К байт. Этот выбор обусловлен тем, что Бейсик широко распространен. Кроме того, хотя реализация интерпретатора Пролога-Д на интерпретаторе Бейсика и уменьшает скорость работы, зато обеспечивается определенная экономия памяти, необходимой для хранения программы на Прологе-Д.
В настоящее время разрабатывается версия Пролога-Д на Бейсике MSX для «Ямахи» и БК-0010. В ней несколько повышена скорость интерпретации.
Простые программы для разных уроков
География. База данных с фактами вида ГРАНИЧИТ (СТРАНА 1, СТРАНА 2) и одним правилом позволит создать информационную систему, дающую сведения о соседях каждой страны. Например, для юго-запада Европы:
ГРАНИЧИТ (ПОРТУГАЛИЯ, ИСПАНИЯ);
ГРАНИЧИТ (ИСПАНИЯ, ФРАНЦИЯ);
ГРАНИЧИТ (ФРАНЦИЯ, ШВЕЙЦАРИЯ);
ГРАНИЧИТ (ФРАНЦИЯ, БЕЛЬГИЯ);
ГРАНИЧИТ (ФРАНЦИЯ, ФРГ);
ГРАНИЧИТ (ФРАНЦИЯ, ИТАЛИЯ);
ГРАНИЧИТ (ФРАНЦИЯ, ЛЮКСЕМБУРГ);
ГРАНИЧИТ (A, B)<-ГРАНИЧИТ (B, A);
На вопрос
? ГРАНИЧИТ (ИСПАНИЯ, ФРАНЦИЯ);
машина ответит «да», а на вопрос
? ГРАНИЧИТ (ИСПАНИЯ, БЕЛЬГИЯ);
ответ будет отрицательный.
Можно узнать и всех соседей Испании, задав вопрос
? ГРАНИЧИТ (ИСПАНИЯ, А);
Ответ будет:
А = ПОРТУГАЛИЯ
А = ФРАНЦИЯ
Легко сформулировать базу данных по принадлежности стран частям света, используя факты вида
НАХОДИТСЯ (СТРАНА, ЧАСТЬ СВЕТА);
Аналогично можно заложить информацию о природных условиях и ресурсах каждой страны, городах, населении, промышленности и т. д.
История. Курс истории содержит большое количество фактов, поэтому историческая информация легко укладывается в конструкции Пролога-Д. Например, база данных с фактами вида
СОБЫТИЕ (НАИМЕНОВАНИЕ, СТРАНА, ГОД НАЧАЛА, ГОД КОНЦА)
позволит записать основные исторические события, относящиеся к той или иной эпохе. Формулируя различные вопросы, можно узнать, что, когда, где произошло. А добавив в вопросы операции сравнения над целыми числами, можно получить интересные сведения и по хронологии. База данных об исторических деятелях создается с использованием фактов вида
ИСТОРИЧЕСКИЙ ДЕЯТЕЛЬ (ИМЯ, ГОД РОЖДЕНИЯ, ГОД СМЕРТИ);
Иностранный язык. Достаточно просто написать программу, которая будет представлять собой англо-русский и русско-английский словари одновременно. С ее помощью отыскиваются эквиваленты русских и английских слов, проверяется словарный запас. База данных имеет вид
ЗНАЧЕНИЕ (МАМА, MAMMY);
ЗНАЧЕНИЕ (ПАПА, DADDY);
ЗНАЧЕНИЕ (БАБУШКА, GRANNY);
ЗНАЧЕНИЕ (МИР, PEACE);
ЗНАЧЕНИЕ (НЕБО, SKY);
и т. д.
Задав несколько вопросов, можно получить ответы:
? ЗНАЧЕНИЕ (МИР, А);
А = PEACE
? ЗНАЧЕНИЕ (A, SKY);
А = НЕБО
? ЗНАЧЕНИЕ (ПЕТЯ, А);
НЕ ЗНАЮ
? ЗНАЧЕНИЕ (МАМА, MAMMY);
ДА
Таким образом, используя минимальные средства логического программирования и создавая простейшие базы данных, можно строить интересные, полезные компьютерные системы для самых разных школьных уроков. Если же привлечь мощные средства Пролога для обработки списков, аппарат встроенных функций, то нетрудно построить простые системы автоматического перевода с языка на язык, аналитических преобразований. И как знать, может быть, скоро, овладев аппаратом логического программирования, школьники будут строить свои маленькие экспертные системы? Давайте попробуем поработать с Прологом!
CodeMaster
26.05.2019, 20:57
Нужно это кому-нибудь?
Я конечно не программист, но посмотрел несколько примеров на Вики, на Хабре и уже из этой книги - у меня от них взрывает моск :-)
у меня от них взрывает моск
Оно из разряда декларативного программирования - задаешь правила, задаешь вопрос - комп сам пытается найти ответ. Из этой же оперы SQL :)
пролог наверное самый простой язык из всех что есть, но у тех кто привык к императивному, у тех мозг взрывается, мне пришлось интерпретатор (https://github.com/raydac/jprol) в свое время написать что бы понять как что работает и за студентов задания поделать
CodeMaster
26.05.2019, 21:40
Из этой же оперы SQL
Про это я читал, это действительно похоже на БД, но написанную plain text. И если почитать коменты, то всё, в принципе, понятно. Непонятно только как читать/писать программу если она больше 5 строчек, как удержать в голове структуру БД :-/
Непонятно только как читать/писать программу
Делится на две части.
Часть первая - выборка информации
Часть вторая - добавление, изменение, удаление.
Если программер крут - он первую часть решает одним оператором выборки. Со второй частью значительно тяжелей (и как правило одним оператором обойтись можно только в тривиал случаях).
Но поскольку действительно -
удержать в голове структуру БД
тяжело, ибо проектирование структуры преследует не удобство, а производительность, обычно сейчас применяют всякие обёртки, которые являются мостиком между удобством работы с объектами в предметной области (например - накладная - с точки зрения, скажем, бухгалтерии - единое целое, куда как атрибуты входят всякие даты покупки, клиент, позиции и тюпю - всё в ОДНОМ объекте) и правильностью хранения инфы в БД. И уж как оно там объект предметной области раскладывает на всякие таблице и иже с ними - программера не заботит. Да, с одной стороны удобней, а с другой стороны появилась куча программеров, которые работают с БД, вообще не представляя - а чего там в ней и как... В общем - за всё надо платить.
CodeMaster
26.05.2019, 22:32
пролог наверное самый простой язык из всех что есть
То же во многих статьях пишут, но чес гря не совсем понимаю в чём его простота. Хотя там пишут, что он прост в чтении программы, но сложен в написании. Но по мне он в чтении не прост, кроме того, как писал ранее, в голове всё равно приходится держать структуру, так и не очень понятно по синтаксису.
Почему вместо
МАМА (НАДЯ, АСЯ);
не писать
НАДЯ (МАМА) АСЯ;
что ближе к естественному языку.
Так же непонятно почему тут СОБЫТИЕ (НАИМЕНОВАНИЕ, СТРАНА, ГОД НАЧАЛА, ГОД КОНЦА); в скобках свойства события, а предыдущем случае не так и единообразней тогда была бы запись НАДЯ (МАМА, АСЯ);
мама(надя, ася) это потому что описывает факт что надя это мама аси, считай что у тебя таблица в базе данных с именем "мама" и в ней два столбца первый кто и второй кого
Меня пока вымораживает только то, что в статье 1987-го года знаки вопроса отделены пробелами, а в статье 1990-го года пишутся слитно. Автор тот же, журнал тот же, язык тот же, платформа та же... а пишут по-разному.
CodeMaster
27.05.2019, 07:04
Автор тот же, журнал тот же, язык тот же, платформа та же... а пишут по-разному.
Другой редактор (профессия)?
считай что у тебя таблица в базе данных с именем "мама" и в ней два столбца первый кто и второй кого
Да, только у этой таблицы нет наименования колонок и всё это надо держать в голове. Я что-то не увидел, а в Прологе комментарии допускаются? В общем, судить о простоте довольно специализированного языка спустя 40 лет и когда знаком с современными ЯП довольно сложно. Возможно, в 70-х для определённых задач в сравнении с Fortran-77 он был пределом простоты..
Да, только у этой таблицы нет наименования колонок и всё это надо держать в голове.
наименований нет, вместо этого используется порядок и вместо sqlовского select * from мама в прологе получается мама(X,Y)
комментарии в стандартном прологе обычно начинаются с % и до конца строки
программирование в прологе в целом строится на паттерн матчинге, том который сейчас в современные языки входит все больше и больше и считается крутатой, в той же scala к примеру
который сейчас в современные языки
считается крутатой
И который мы (я не про конкретно про паттерн матчинг, а в принципе), не знаю о его крутате использовали в тыща-девятьсот-лохматом-году. Как например - событийное и клиент-серверное программирование в (примерно) 1985 году в игре (многотерминальная) Змейка. Помню, визг при игре в неё стоял почище, чем при сетевой игре в Doom в (примерно) 1995 :)
Я пока вот что не понял в Прологе: как он отличает значение от переменной?
В том же англо-русском словаре есть такие слова как A и I. Если я задам вопрос ? RUSENG(Я,I) какой ответ получится - I=I или TRUE? То есть буква I будет воспринята как переменная, для которой надо найти значение, или как значение, которое связано с "Я"?
Пока что мне попадались примеры типа ? RUSENG(Я,A) и они выдавали ответ A=I, что логично. Но ведь я заранее не знаю какое там значение, и выбранное мной имя переменной может совпасть со значением. Тогда ответ получится не string, а boolean. Возможно, "I=I" автоматически преобразуется в "TRUE", но на фига мне TRUE, если я хочу получить текстовое значение для дальнейшего использования?
CodeMaster
27.05.2019, 10:57
как он отличает значение от переменной?
Где-то написано, что в нём нет переменных.
? RUSENG(Я,I)
А эту "I" можно потом использовать в выражениях именно как переменную или это просто "болванка" для получения ответа?
Где-то написано, что в нём нет переменных.
А эту "I" можно потом использовать в выражениях именно как переменную или это просто "болванка" для получения ответа?Болванка для получения ответа. Или, точнее, локальная переменная. Согласно документации, в Прологе переменные действуют только внутри одной строки.
Но ответ всё равно же куда-то выдаётся, наверное его можно использовать? Что-то такое было написано, что не всегда возможно составить запрос одной строкой.
- - - Добавлено - - -
А, вот пишут «вопрос не должен содержать новых атомов и переменных». Но опять же, если при задании правила я использовал переменную I, то как Пролог определит что я имел в виду в вопросе: переменную I или её значение, равное I?
Или вот ещё пример. У нас есть англо-русский словарь (описан выше в документации). Я хочу ввести новое правило: как определить, что слова - синонимы. Во всех примерах используют переменные a, b, c или x, y, z, но я хочу использовать I, J, K - вроде как не запрещено. Тогда получается:
СИНОНИМ(I,J)<-RUSENG(I,K),RUSENG(J,K);
СИНОНИМ(I,J)<-RUSENG(K,I),RUSENG(K,J);
То есть два слова - синонимы, если для них находятся одинаковые переводы на английский (первое правило) или одинаковые переводы на русский (второе правило). Правда, здесь не учитывается что слов вообще может не быть в словаре (но это пока и не важно).
Теперь я хочу написать вопрос. Он не должен содержать новых переменных. Хорошо, использую переменную I. Пишу:
? СИНОНИМ(I,Я)
И не понимаю, что должен выдать Пролог - все синонимы слова "Я" (me, I, myself, ego) или значение "ИСТИНА" (в том смысле, что да, "I" и "Я" - синонимы).
И не понимаю, что должен выдать Пролог
Зависит от того, что он считает переменной. Судя по документации, можно предположить, что переменными он считает только латинские буквы от A до Z, то есть однобуквенные слова на латинице. Тогда кроме I = Я должны выдаться другие русские слова, которые переводятся на английский как me, myself, ego (если они есть в списке фактов).
Вообще, насколько я помню, в большинстве реализаций, переменные - это любые слова, начинающиеся с заглавной латинской буквы. Чтобы такое слово не считалось переменной, его нужно писать в кавычках.
Вообще, насколько я помню, в большинстве реализаций, переменные - это любые слова, начинающиеся с заглавной латинской буквы. Чтобы такое слово не считалось переменной, его нужно писать в кавычках.Примеры из Wikipedia заключают английские слова в кавычки. В документации к Пролог-Д для БК-0010 об этом пока ни слова.
Кстати, обнаружил арифметическую ошибку в статье 1990-го года. Неправильный результат работы программы у них там. Я даже проверил, набив эту программу... Ну ничего, исправляю по ходу дела. Выложу документацию уже без ошибок.
А вообще, судя по всему, придётся свою документацию написать - сжатую и понятную.
CodeMaster
27.05.2019, 17:54
И не понимаю, что должен выдать Пролог
А есть онлайн машины с Пролог близкие к этому или классическому? Я попробовал пару сайтов, но они вообще синтаксин подобный этому или с Вики не понимают. Посмотрел их примеры, там вообще всё не так :-/
"Информатика и образование" №4 1990
Скачать: 69098
С. Григорьев
Йошкар-Ола
Работа системы Пролог-Д
Определяющим направлением развития информатики является создание технологии обработки знаний. Особую роль в этом процессе призваны сыграть языки логического программирования, в частности Пролог. Использование Пролога в народном образовании СССР связывается и с новым учебником информатики, и с широкими перспективами в изучении логики, элементов искусственного интеллекта, становящихся все более актуальными.
Ранее считалось, что транслятор с Пролога реализуем только на мощных компьютерах, имеющих высокое быстродействие и большие объемы памяти. Ограниченность возможностей школьных машин была серьезным препятствием на пути внедрения систем логического программирования в народное образование. Однако путем некоторого изменения синтаксиса входного языка и совершенствования алгоритмов удалось разработать компактную и эффективную версию системы логического программирования Пролог-Д для самых массовых учебных ЭВМ, используемых в СССР. В настоящее время полностью завершена разработка Пролога-Д для КУВТ «Ямаха МSХ-2», КУВТ-86, «Электроники БК-0010 (.01)» с различными устройствами внешней памяти (магнитофон, кассета ПЗУ). В стадии завершения - работы на ПЭВМ «Электроника УКНЦ», «Электроника БК-0011», «Ямаха МSХ-1».
Данная статья открывает цикл, посвященный принципам работы с системой Пролог-Д. Она посвящена начальному этапу - работе с редактором и запуску системы. Описываются две версии Пролога-Д: для МSХ-2 и БК-0010. Версии отличаются друг от друга некоторыми возможностями и деталями интерфейса, что обусловлено разными клавиатурами и техническими возможностями ПЭВМ, поэтому статья (как и весь цикл) будет разделена на две части: одна описывает версию 3.2 для ПЭВМ «Ямаха МSХ-2», а вторая - для КУВТ-86, «Электроника БК-0010 (.01)».
Система логического программирования Пролог-Д располагает достаточно развитыми средствами услуг пользователю. Целесообразно перед началом знакомства с языком освоить принципы работы с системой.
Пролог-Д МSХ-2, версия 3.2
Информация на экране дисплея
После загрузки системы Пролог-Д на экране появляется заставка, а затем - окно исходного текста Пролог-программы.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
|
--------------------------------------------------------------
<имена встроенных предикатов>
Окно исходного текста используется для записи и редактирования программ на Прологе-Д. Для редактирования используется встроенный экранный редактор, его директивы приведены ниже. Отмеченные на рисунке стрелкой четыре квадратика в верхней строке представляют собой указатель, показывающий заполнение базы знаний. Положение указателя полностью заполненной базы знаний на рисунке отмечено точкой.
Редактор системы
Текст программы можно ввести с клавиатуры либо с внешнего устройства (дисковода). Для ввода текста с клавиатуры можно пользоваться всеми алфавитно-цифровыми клавишами. В тексте может быть любое количество пробелов, они игнорируются. Однако длина строки не более 128 символов. Ввод предложения осуществляется нажатием клавиши RETURN. Обязательное условие: в одной строке должно быть только одно предложение Пролога-Д.
Для редактирования текста программы используются управляющие клавиши стандартной клавиатуры ПЭВМ. Список выполняемых ими функций приведен в таблице.
Действие
Кодирование
Перемещение по тексту
<стрелки>
Перемещение в начало текста
Ctrl+K
Перемещение в конец текста
Ctrl+V
Перемещение в конец предложения
Ctrl+N
Уничтожить символ слева от курсора
BS
Уничтожить символ в позиции курсора
DEL
Уничтожить текст базы знаний
Ctrl+C
Уничтожить предложение
Ctrl+U
Уничтожить символы до конца предложения
Ctrl+E
Включение/выключение режима вставки
INS
Вывод текста программы на экран
Ctrl+T
Печать текста базы знаний с остановкой
Ctrl+t+stop
В данной версии системы Пролог-Д не предусмотрена «сборка мусора» при редактировании файлов, в результате может возникать переполнение памяти при длительном редактировании. Поэтому целесообразно пользоваться традиционными редакторами текстов с последующим вводом программ с дисковода.
Система Пролог-Д предполагает использование встроенных предикатов. Их имена запрограммированы на специальных клавишах, обозначаемых символами F2-F10. Такое использование клавиш существенно облегчает работу с системой. Особое значение имеет клавиша F1. Ею кодируется имя последнего введенного предложения программы.
Работа с дисководом допускает три режима: чтение файла, запись файла, просмотр файлов на диске.
Для чтения файла с диска нужно нажать клавиши Ctгl+L и в ответ на приглашение Чтение. Имя файла: [<имя дисковода>:] <Имя файла> ввести имя нужного файла. Обратите внимание: при чтении файла старое содержимое базы знаний пропадает. Для создания файла можно пользоваться не только редактором системы Пролог-Д, но и другими текстовыми редакторами.
Для записи файла на диск нужно нажать клавиши Сtrl+S и в ответ на приглашение Запись. Имя файла: [<имя дисковода>:] <Имя файла> ввести имя нужного файла. База знаний записывается на диск целиком.
Для просмотра директория достаточно нажать клавиши Сtrl+D и в ответ на приглашение Просмотр файлов: [<имя дисковода>:] <Имя файла> ввести имя нужного файла (файлов).
Для завершения работы с системой Пролог-Д нужно нажать клавиши Ctrl+Q (будьте внимательны - результаты работы безвозвратно теряются!).
Примеры работы с редактором
Исправление неверного символа.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),pапа(z,y);
В подчеркнутом слове необходимо заменить латинскую букву p на русскую букву п. Для этого надо установить курсор под этим символом, нажать INS, набрать правильные символы, нажать RETURN, вновь нажать INS.
Удаление неверного символа.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),pпапа(z,y);
В подчеркнутом слове необходимо удалить латинскую букву p. Для этого необходимо установить курсор под этим символом, нажать DEL и RETURN.
Вставка символа.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),апа(z,y);
В подчеркнутом слове необходимо вставить букву п. Для этого необходимо установить курсор под этим символом и нажать п и RETURN.
Удаление предложения.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),pапа(z,y);
Подчеркнутое предложение необходимо удалить. Для этого необходимо установить курсор на удаляемую строку и нажать Ctrl+U. В результате получится:
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
|
Удаление текста до конца предложения.
** Пролог-Д ** Версия 3.2 ** MSX-2. YIS805/128 ****
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),папа(z,y);комментарий В подчеркнутом предложении необходимо удалить слово «комментарий». Для этого необходимо установить курсор перед удаляемым словом и нажать Ctrl+E.
Запуск системы
Чтобы проверить работоспособность системы Пролог-Д, достаточно набрать вопрос - предложение, начинающееся с символа «?». Проще всего составить его из встроенных предикатов. Они предназначены для выполнения арифметических действий, вывода графики и других подобных операций. Встроенные предикаты, если они записаны в вопросе, должны выполняться одинаково независимо от того, записана в память машины база знаний или нет и какая это база знаний. В определенном смысле это напоминает непосредственный режим работы в Бейсике. Например, если необходимо построить на экране отрезок, соединяющий точки с координатами (10, 10) и (100, 100), то достаточно задать вопрос:
? ЛИНИЯ (10,10,100,100,1);
Требуемый отрезок появится на экране. Для возврата в редактор достаточно дважды нажать на любую клавишу.
Если необходимо вычислить число х=2*З+1, то для этого достаточно набрать вопрос:
? УМНОЖЕНИЕ(2,3,1,х);
Ответ системы:
х=7
ДРУГИХ РЕШЕНИЙ НЕТ
Чтобы попробовать более сложные примеры работы системы Пролог-Д, рекомендуется набрать текст такой базы знаний:
мама(Люся,Саша);
папа(Сережа,Саша);
бабушка(Надя,Саша);
внук(х,у)<—бабушка(у,х);
Ей можно задать вопрос
? мама(х,Саша)
означающий «Как зовут маму Саши?». Ответ системы:
х=Люся
ДРУГИХ РЕШЕНИЙ НЕТ
Нажмите на любую клавишу, и база знаний вновь появится на экране. Можно попробовать задать еще несколько вопросов, например:
? бабушка(х,у);
? внук(х,у)
? папа(Сережа,х);
О том, почему получаются именно такие ответы, будет рассказано в дальнейшем.
Пролог-Д «Электроника БК-0010» (КУВТ-86)
Информация на экране дисплея
После загрузки системы на экране появляется заставка, а затем - окно исходного текста Пролог-программы.
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
Окно исходного текста используется для записи и редактирования программ на Прологе-Д. Для редактирования используется встроенный экранный редактор.
Для индикации результатов работы используется окно вывода результатов.
* Пролог-Д 1.0 * Выполнение ЛАТ
Окно результатов выводится на экран автоматически после ввода вопроса.
Для возврата в окно исходного текста достаточно нажать любую клавишу.
Редактор системы
Работа с клавиатурой отличается от Пролога-Д для МSX-2 максимальной длиной строки (64 символа) и наличием подсказки - нажатие клавиш КТ и ? вызывает на экран список функций управляющих клавиш.
Для чтения файла с ленты нужно нажать клавиши КТ+Ч и в ответ на приглашение «Имя?» ввести имя нужного файла. При чтении файла прежнее содержимое базы знаний уничтожается. Для подготовки файла можно пользоваться не только редактором системы Пролог-Д, но и другими текстовыми редакторами.
Для записи файла на ленту нужно нажать клавиши КТ+З и в ответ на приглашение «Имя?» ввести имя нужного файла. База знаний записывается на ленту целиком.
Для завершения работы с системой Пролог-Д нужно нажать клавиши КТ+К.
Примеры работы с редактором
Исправление неверного символа.
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),pапа(z,y);В подчеркнутом слове необходимо заменить латинскую букву p на русскую букву п. Для этого необходимо установить курсор справа от буквы p, нажать клавиши ⇤, ⇥, РУС, набрать правильный символ п.
Удаление неверного символа.
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),pпапа(z,y);В подчеркнутом слове необходимо удалить латинскую букву p. Для этого необходимо установить курсор справа от буквы p и нажать клавишу ⇥.
Вставка символа.
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),апа(z,y);В подчеркнутом слове необходимо вставить букву п. Для этого необходимо установить курсор под этим символом, нажать клавишу ⇥ и нужную символьную.
Уничтожение текста программы.
Нажать одновременно клавиши СБР и РП.
Удаление предложения
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),папа(z,y);Подчеркнуто е предложение необходимо удалить. Для этого необходимо установить курсор в начало удаляемой строки и нажать клавиши СБР и ⇥.
Удаление текста до конца предложения.
* Пролог-Д 1.0 * Редактирование * КТ+? Подсказка ЛАТ
бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),папа(z,y);комментарий В подчеркнутом предложении необходимо удалить слово «комментарий». Для этого необходимо установить курсор перед удаляемым словом и нажать клавиши СБР и ⇥.
Запуск системы
Проверка работоспособности системы производится так же, как и на MSX-2. Отличия - в синтаксисе. Например, если необходимо построить на экране отрезок, соединяющий точки с координатами (10, 10) и (200, 200), то нужно задать вопрос:
? ОТР(10,10,200,200,1);
Если необходимо вычислить число х= 2*3+1, то нужно задать вопрос:
? ВЫЧ(2,3,1,х);
Дальнейшая работа с Прологом-Д на БК-0010 аналогична работе на «Ямахе» MSX-2.
CodeMaster
27.05.2019, 20:23
Если необходимо вычислить число х=2*З+1, то для этого достаточно набрать вопрос:
? УМНОЖЕНИЕ(2,3,1,х);
Ответ системы:
х=7
ДРУГИХ РЕШЕНИЙ НЕТ
КАК??? Как это можно понять :-/ А если х=2+З*1 или х=2*З*1
КАК??? Как это можно понять :-/ А если х=2+З*1 или х=2*З*1А вот об этом – в следующей статье :)
CodeMaster
27.05.2019, 21:12
А вот об этом – в следующей статье
Даже если там дальше есть хаки, то зачем выдавать такой пример, который сразу ставит в ступор? Или это для подогрева интереса делал автор?
Даже если там дальше есть хаки, то зачем выдавать такой пример, который сразу ставит в ступор? Или это для подогрева интереса делал автор?Технари, что с них взять? :)
Я потом напишу нормальную документацию. На самом деле уже написал половину.
Потыкал Пролог-Д 1.0 в эмуляторе, переменными он считает однобуквенные имена, не важно русские/латинские. В процессе выяснилось, у меня в эмуляторе невозможно набрать букву "ы", печалька... (шутка, можно, но почему икс?)
я так понимаю, что пролог-д, это весьма специфическая проприетарная разработка которая не столь следует стандарту (хотя бы глядя на использование конца утверждения при помощи ';' вместо точки), скорее всего он для учебных целей был автором сильно переработан что бы школьники понимали лучше
в прологе переменные начинаются с заглавной буквы и могут инициализироваться один раз после чего их значение не меняется, если хочется написать x= 2*3 +1 то на прологе это X is 2*3+1, программа будет выглядить что то вроде primer(X):-X is 2*3+1. причем если попытаться искать при помощи primer(11) то будет NO так как 11 это не 7, а если primer(7) то будет YES
кто хочет поиграться с прологом, может поюзать мой движок (https://github.com/raydac/jprol/releases) (требует установленной Java 1.8+), примеры разные можно тут посмотреть тут (https://github.com/raydac/jprol/tree/master/examples/prolog)
Так вроде была уже?
Которая "Пpoлoг-Д 1.0 (C) Copyright 1990 by AW Corp." ?
Кстати да, у меня именно этот вариант, работает с адреса 1000.
с адреса 1000
А как же он тогда в ПЗУ был. Может он просто с любого адреса работает? В смысле перемещаемый
А как же он тогда в ПЗУ был. Может он просто с любого адреса работает? В смысле перемещаемыйв ПЗУ версия 1.1 выпущенная в 1992-ом году
У меня в ПЗУ 1.0
1.1 - это у ММ
Дописываю новую документацию, а пока для истории продолжаю выкладывать старые публикации:
"Информатика и образование" №5 1990
С. Григорьев
Йошкар-Ола
Программирование на Прологе-Д
Программа на Прологе представляет собой базу знаний и следующий за ней вопрос. Построению базы знаний посвящена данная статья. Здесь рассматриваются структура программы и некоторые приемы технологии программирования, связанные с использованием встроенных предикатов, рекурсии, графики, специфичные для Пролога-Д. Как и прежде во всех случаях, где это необходимо, будут оговариваться различия Пролога-Д MSX и Пролога-Д БК-0010.
Факты и правила
Особенностью языка Пролог-Д, отличающей его от других языков, используемых для работы на ЭВМ, является его применение не для программирования, но главным образом для описания данных и правил их обработки. Построение базы знаний на Прологе-Д означает выявление множества исследуемых объектов и связей между ними, совокупность которых описывает явление или процесс: иными словами, создание информационно-логической модели описываемого на языке Пролог-Д явления или процесса.
Первый шаг построения базы знаний состоит в выявлении объектов и соотношений между ними, отвечающих на вопрос «что дано?». Такую информацию целесообразно представлять в виде совокупности факсов. Классическим примером фактографии служит англо-русский словарь. Записанный средствами Пролога-Д, он выглядит так:
русангл(мама,mammy);
русангл(небо,sky);
русангл(солнце,sun);
русангл(мальчик,boy);
и т.д. Подобные отношения представляют собой грамматическую конструкцию Пролога-Д, называемую фактом. Факт задается в виде функционала: имя и совокупность аргументов. В данном примере «русангл» - это имя; оно определяет информацию, записываемую в факте. Русские и английские слова мама, mammy, небо, sky, солнце, sun, мальчик, boy представляют собой аргументы фактов, определяющих взаимно-однозначное соответствие между русскими и английскими словами. Необязательно, чтобы факт имел два аргумента. Например, факт
мужчина(Николай);
имеет один аргумент Николай, а факт
родился(Петров,Иван,10,сентя брь,1979);
имеет пять аргументов. Однако с точки зрения синтаксиса языка Пролог-Д необходим хотя бы один аргумент. Если факт в базе знаний имеет имя и не имеет аргументов, то система выдаст сообщение о синтаксической ошибке.
Приведенный пример, по сути дела, уже является базой знаний. Перед этой базой знаний можно ставить различные вопросы:
?русангл(у,х);
если необходимо узнать все слова, хранящиеся в базе знаний;
?русангл(мама,х);
чтобы узнать, как по-английски «мама»;
?русангл(х,sky);
чтобы узнать, что значит слово sky.
Для описания всего множества информации достаточно фактов. Однако если можно задать некоторые связи и отношения между объектами, то удается сократить число фактов и тем самым сделать базу знаний более лаконичной. Связи и отношения между объектами задаются правилами. При построении правил выделяется совокупность отношений, отвечающих на вопрос «что известно?». Правило можно построить, пользуясь известным принципом разделения исходной задачи на более простые, которые тоже, в свою очередь, могут быть разделены. Этот процесс известен под названием декомпозиции задачи. Декомпозиция заканчивается в тот момент, когда отношения связывают зафиксированные в базе знаний объекты. Например, в задаче о построении родственных отношений можно определить следующие правила:
бабушка(x,y)<-мама(x,z),мама(z,у);
бабушка(х,у)<-мама(x,z),папа(z,y);
дедушка(х,у)<—папа(х,z),папа(z,у);
дедушка(х,у)<-папа(x,z),мама(z,y);
Левая часть правила называется головой; разделенные запятыми выражения в правой части - целями; последние образуют тело правила.
Процесс декомпозиции не обязательно однозначен. Даже простой пример о родственниках допускает и иную трактовку. Если ввести правило, определяющее понятие «родитель»
родитель(х,у)<-мама(х,у);
родитель(х,у)<-папа(х,у);
то бабушку и дедушку можно определить проще:
бабушка(х,у)<-мама(x,z),родитель(z,y);
дедушка(х,у)<-папа(x,z),родитель(z,y);
Если к только что записанным правилам добавить несколько фактов, определяющих мам и пап, то получается база знаний «семья»:
мама(Саша,Петя);
папа(Сережа,Петя);
мама(Оля,Саша);
папа(Коля,Саша);
мама(Люда,Сережа);
папа(Петя,Сережа);
родитель(x,y)<-мама(x,y);
родитель(x,y)<-папа(x,y);,
бабушка(x,y)<-мама(x,z),родитель(z,y);
дедушка(x,y)<-папа(x,z),родитель(z,y);
В данном примере для определения понятия родитель(х, у) потребовалось более одного правила. По сути дела, здесь использовано недетерминированное ветвление, дающее альтернативное определение этого отношения и используемое системой после того, как было применено первое отношение. Следует подчеркнуть, что в определении участвуют оба правила. В общем случае число правил не ограничено.
Упражнения.
В электронике известно понятие «стандартный ряд номинальных значений сопротивлений»: 10, 11, 12, 13, 15, 16, 18, 20 22, 24, 27, ЗС, 33, 36, 39, 43, 47, 51, 56, 62, 68, 75, 82, 91. Любое сопротивление, выпущенное промышленностью, имеет номинал, кратный элементам указанного ряда. Напишите базу знаний, в которой описывается этот ряд.
Опишите на языке Пролог-Д состав своей семьи.
Составьте базу знаний, описывающую республики, входящие в состав СССР.
Напишите на языке Пролог-Д таблицу умножения чисел от 1 до 10. Какое количество предложений требуется для записи этой базы знаний?
Арифметические и другие встроенные предикаты в Прологе-Д
Системы логического программирования, к числу которых относится и Пролог-Д, не предназначены для вычислений. Традиционный для Пролога-Д подход при выполнении арифметических действий дан в упражнении 4 из предыдущего раздела. Однако для определения таким образом всех математических действий памяти компьютера будет явно недостаточно. Поэтому традиционные действия, связанные с выполнением арифметических операций, осуществляются посредством специальных, так называемых встроенных предикатов.
В системе Пролог-Д БК-0010 для выполнения арифметических действий предусмотрен один встроенный арифметический предикат:
ВЫЧ(Арг1,Арг2,АргЗ,Арг4)
В системе Пролог-Д MSX для выполнения арифметических действий предусмотрены два встроенных арифметических предиката:
УМНОЖЕНИЕ(Арг1,Арг2,АргЗ,Арг 4)
СЛОЖЕНИЕ(Арг1,Арг2,АргЗ)
Встроенный предикат ВЫЧ (в MSX УМНОЖЕНИЕ) имеет четыре аргумента (целых; переменных, конкретизированных целыми; неконкретизированных переменных). ВЫЧ (в MSX УМНОЖЕНИЕ) обеспечивает реализацию формулы
Арг1*Арг2+Арг3=Арг4
Предикаты предусматривают обратимость аргументов и полностью покрывают арифметические операции в области целых чисел, предусмотренных синтаксисом входного языка (0 <= <число> <= 65535 «Электроника БК-0010» и -32766 <= <число> <= 32766 в системе MSX). Если результат дробный, он округляется до целого. Оба предиката могут быть использованы только в качестве цели в предложении.
Предикат СЛОЖЕНИЕ (Арг1,Арг2,АргЗ) обеспечивает реализацию формулы
Арг1+Арг2=Арг3
Следующая база знаний на языке Пролог-Д показывает, как можно описать любые арифметические операции в системе Пролог-Д БК-0010:
сложение(X,Y,Z)<-ВЫЧ(1,X,Y,Z);
вычитание(X,Y,Z)<-ВЫЧ(1,X,Z,Y);
умножение(X,Y,Z)<-ВЫЧ(X,Y,0,Z);
деление(X,Y,Z)<-ВЫЧ(Y,Z,0,X);
Во всех четырех случаях X, Y - операнды операций, a Z - результат. Например, СЛОЖЕНИЕ (X, Y, Z) реализует арифметическую операцию Z=X+Y.
Аналогично в системе Пролог-Д MSX:
вычитание(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Z,Y);
умнож(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);
деление(X,Y,Z)<-УМНОЖЕНИЕ(Y,Z,0,X);
Обратите внимание, вычитание можно определить в MSX и иначе:
вычитание(X,Y,Z)<-СЛОЖЕНИЕ(Y,Z,X);
Более подробное описание синтаксиса встроенных арифметических предикатов ВЫЧ, УМНОЖЕНИЕ, СЛОЖЕНИЕ приведено в технических описаниях трансляторов.
Пример 1. На Прологе-Д опишем вычисление площади прямоугольника, имеющего стороны длиной a и b: S=a*b. Соответствующий предикат должен иметь три аргумента - длины сторон и величину площади. Имя предиката должно отражать его назначение, этому критерию удовлетворит имя «площадь». В системе Пролог-Д БК-0010:
умножение(X,Y,Z)<-ВЫЧ(X,Y,0,Z);
площадь(a,b,S)<-умножение(a,b,S);
Первый предикат «умножение» потребовалось определить для наглядности записи. Необходимо отметить, что предикат «площадь» обратим, это означает, что, пользуясь этим описанием, можно вычислить не только площадь по заданным сторонам, но и любую (одну) сторону по другой стороне и площади. Перед базой знаний можно поставить вопрос:
?площадь(10,20,S);
Ответ системы Пролог-Д: S=200
?площадь(a,20,100);
Ответ системы Пролог-Д: а=5
В системе Пролог-Д MSX:
умнож(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);
площадь(a,b,S)<-умнож(a,b,S);
Пример 2. На Прологе-Д необходимо описать вычисление объема параллелепипеда высотой h, в основании которого прямоугольник, имеющий стороны длиной a и b: V=a*b*h. Соответствующий предикат должен иметь четыре аргумента - длины сторон a, b, высоту h и объем V.
В системе Пролог-Д БК-0010:
умножение(X,Y,Z)<-ВЫЧ(X,Y,0,Z);
объем(a,b,h,V)<-умножение(a,b,S),умножение(S,h,V );
Как и прежде, предикат «объем» обратим, это означает, что, используя это описание, можно вычислить не только объем по заданным сторонам и высоте, но и любую (одну) сторону или высоту по высоте, стороне и объему.
Можно иначе записать объем, если воспользоваться формулой V=Sz. Эту базу знаний предлагается написать самостоятельно.
Перед данной базой знаний можно поставить вопрос:
?объем(10,20,5,V);
Ответ системы Пролог-Д: V=1000
В системе Пролог-Д MSX:
умнож(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);
объем(a,b,h,V)<-умнож(а,b,S),умнож(S,h,V);
Наряду с арифметическим предикатом в системе БК-0010 существуют два предиката БОЛ и НЕ.
Встроенный предикат БОЛ (Арг1,Арг2) предназначен для сравнения двух целых констант или переменных. Он имеет два аргумента (целых или переменных конкретизированных целыми). Оба аргумента к моменту выполнения должны быть определены. Если эти требования не выполнены, то появится сообщение об ошибке: «Функция не может быть выполнена (ошибка 34)». Предикат выполнен, если Арг1>Арг2, иначе не выполнен.
Несмотря на то что предикат БОЛ один, его достаточно для описания всех возможных предикатов для сравнения числовой информации: равенство - «равно», меньше - «меньше», меньше и равно - «мир» и т. д. Это показывает база знаний, приведенная ниже.
равно(X,X);
меньше(X,Y)<-БОЛ(Y,X);
мир(X,Y)<-НЕ(БОЛ(X,Y)) ;
В последнем предложении использован встроенный предикат НЕ, его синтаксис:
НЕ(Арг1);
Он имеет один аргумент, который обязательно должен быть предикатом. Предикат НЕ выполнен тогда и только тогда, когда предикат-аргумент не выполнен.
А теперь несложный пример, иллюстрирующий применение БОЛ и НЕ.
Пример 3. Опишите на языке Пролог-Д вычисление функции Хевисайда, определяемую формулой:
h(x)=0, если x<=0;
h(x)=1, если x>0.
База знаний должна содержать описание предиката «меньше и равно», который выше уже был описан; предикат, выполняющийся при вычислении функции Хевисайда, будет называться «хевисайд». Этот предикат будет иметь два аргумента: первый - аргумент функции, второй - ее значение. Предикат «хевисайд» определяется через два альтернативных описания для обоих значений х.
мир(X,Y)<-НЕ(БОЛ(X,Y);
хевисайд(X,0)<-мир(X,0);
хевисайд(X,1)<-БОЛ(X,0);
Перед этой базой знании можно поставить различные вопросы.
?хевисайд(20,X);
Ответ системы Пролог-Д: Х=1
В системе Пролог-Д MSX существует полный набор предикатов сравнения, их имена БОЛЬШЕ, МЕНЬШЕ, РАВНО.
Еще один, последний, встроенный предикат - «отсечение», предназначенный для управления логическим выводом. Этот предикат потребуется для решения следующих проблем:
ограничения количества найденных решений;
нахождения некоторого особенного решения задачи;
ограничения объема поиска с целью повышения эффективности работы системы.
Предикат «отсечение» обозначается восклицательным знаком !. Это традиционное обозначение отсечения в системах логического программирования. Если данный предикат использовать в качестве цели в предложении, то полученный при этом эффект можно проиллюстрировать дверью, через которую можно пройти только слева направо, но нельзя вернуться назад через эту дверь. Роль двери выполняет символ !. Как известно, система Пролог-Д будет пытаться выполнять цели предложения в порядке просмотра слева направо начиная от символа <-, от первой до последней цели. Если какая-либо цель оказывается невыполненной, то осуществляется возврат и делается попытка найти альтернативные решения. Отсечение ограничивает возможность поиска альтернатив с того момента, как была просмотрена цель, обозначенная символом !. Например, если не выполнены цели А,Б,В, возврат для нахождения альтернативных решений в предложении
пример<-А,Б,В,!,Г,Д,Е;
возможен, а если не выполнены цели Г, Д или Е, то уже нет. Рубикон при движении слева направо перейден.
Необходимо отметить важность этого предиката, особенно при описании задач, допускающих множественные решения.
Иллюстрация предиката «отсечение» на примере базы знаний «мама». Действительно, у человека не может быть две матери, поэтому, определив для данного человека имя матери, необходимо прекратить дальнейшие поиски.
мама(Наташа,Петя)<-!;
мама(Наташа,Ваня)<-!;
мама(Оля,Лена)<-!;
мама(Катя,Даша)<-!;
мама(Люда,Сережа)<-!;
мама(Лена,Костя)<-!;
Перед базой знаний может быть поставлен вопрос
?мама(х,Петя);
Ответ системы Пролог-Д:
х=Наташа
ДРУГИХ РЕШЕНИЙ НЕТ
После отыскания первого решения поиск альтернатив не производится. Что будет, если убрать во всех предложениях предикаты отсечения?
Упражнения.
Опишите на языке Пролог-Д вычисление площадей геометрических фигур: трапеции, треугольника, параллелограмма.
Опишите вычисление площади круга и длины окружности. Какова точность вычислений этих величин? Можно ли вычислить радиус круга по длине окружности?
На языке Пролог-Д напишите базу знаний, в которой определяется функция, заданная соотношением:
F(x)=x², если x<1,
F(x)=x+1, если -1<=x<1,
F(x)=x², если x>1.
Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками?
Предположим, что дана программа на Прологе-Д:
ff(xx);
ff(x)<-pp(xx),ff(x);
Каким должен быть предикат рр(х), чтобы система нашла одно решение; бесконечно много решений?
Рекурсия
Существует огромное количество задач, в которых отношения между объектами можно определить, только используя сами определяемые соотношения. При этом получаются правила, называемые рекурсивными. Применение рекурсии для списания задач при работе с системами логического программирования - широко распространенный прием.
Рекурсия будет проиллюстрирована несколькими примерами построения программ, как вычислительных, так и логических.
Первым примером будет пример вычисления наибольшего общего делителя (НОД) двух чисел. Предикат, который выполняется, если найден НОД двух данных чисел, будет иметь имя «нод» и три аргумента: числа a, b и значение НОД - c. Для описания вычисления НОД используются следующие соображения:
если a=b, то c=a=b;
если a>b, то необходимо вычислить НОД для чисел b и a-b;
если b>а, то необходимо вычислить НОД для чисел a и b-a.
Эти три утверждения естественным образом могут быть записаны на Прологе-Д в системе БК-0010.
нод(a,a,a);
нод(a,b,c)<-БОЛ(a,b),вычитание(a,b,d),нод(b,d,c );
нод(a,b,c)<-БОЛ(b,a),вычитание(b,a,d),нод(a,d,c );
вычитание(X,Y,Z)<-ВЫЧ(1,Y,Z,X);
Если перед этой базой знаний поставить вопрос
?нод(10,15,х);
то система Пролог-Д ответит:
x=5
ДРУГИХ РЕШЕНИЙ НЕТ
Предикат «нод» оказывается обратимым.
В системе Пролог-Д MSX последняя строка базы знаний запишется иначе:
вычитание(X,Y,Z)<-СЛОЖЕНИЕ(Y,Z,X);
а предикат БОЛ необходимо заменить на БОЛЬШЕ. Других изменений нет.
В качестве второго примера рассмотрим задачу о вычислении элементов последовательности 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... известной как последовательность Фибоначчи. Каждый ее элемент определяется следующими правилами:
f(0)=0,
f(1)=1,
f(n)=f(n-1)+f(n-2)
Первая формула утверждает, что значение нулевого элемента последовательности равно нулю. Это можно записать в виде факта
Фб(0,0);
Вторая утверждает, что первый элемент равен 1. На Прологе-Д это можно записать так:
Фб(1,1);
Третья формула представляет собой запись рекурсивного соотношения, переписываемого так:
Фб(N,X)<-БОЛ(N,1),вы(N,1,M),вы(N,2,K),Фб(M,Y),Фб (K,Z),сл(Y,Z,X);
«вы» и «сл» - имена предикатов «вычитание» и «сложение», определенных с помощью правил
сл(X,Y,Z)<-ВЫЧ(1,X,Y,Z);
вы(X,Y,Z)<-ВЫЧ(1,Y,Z,X);
в системе БК-0010. Использование таких обозначений объясняется тем, что длина одной строки в редакторе системы Пролог-Д БК-0010 не должна превышать 64 символов.
Данные предложения представляют собой базу данных на языке Пролог-Д, позволяющую вычислять значения элементов последовательности. На вопрос
?Фб(8,X);
система Пролог-Д ответит:
X=21
ДРУГИХ РЕШЕНИЙ НЕТ
Поиск числа Фибоначчи с порядковым номером более 8 невозможен в БК-0010 из-за ограниченной памяти, поэтому рекомендуется первым предложением базы знаний написать
Фб(N,Y)<-БОЛ(N,8),!;
Необходимо сказать, что такой путь решения данной задачи не самый лучший. Для нахождения N+1 числа Фибоначчи требуется 2(N+1)-1 рекурсивное обращение. Однако этого можно избежать, если перейти к другой базе знаний, в которой предикат с именем «Фиб» определен как имеющий три аргумента, включающий в себя в качестве аргумента значения N-го и N-1-го элементов последовательности. Запишем эту базу знаний.
Нулевой элемент последовательности равен нулю, а «минус первый» не определен:
Фиб(0,X,0);
в данном случае значение X может быть любым.
Первый элемент последовательности равен 1, а нулевой - 0:
Фиб(1,0,1);
Для остальных элементов:
Фиб(N,F,f)<-БОЛ(N,1),вы(N,1,M),Фиб(M,Ф,F),сл(Ф,F,f );
Обращение к этой базе знаний будет иметь вид:
?Фиб(10,F,f);
Ответ системы Пролог-Д:
F=55,
f=34
ДРУГИХ РЕШЕНИЙ НЕТ
При работе с этой базой знаний для вычисления N-го числа Фибоначчи необходимо всегда лишь N рекурсивных обращений.
Для системы Пролог-Д характерна особенность, проявляющаяся при работе с рекурсивными программами. В общем случае порядок предложений в базе знаний не имеет значения. Однако в нижеследующем примере эго не так.
родитель(X)<-родитель(Y),отец(Y,Z);
родитель(Коля);
отец(Коля,Петя);
родитель(Петя);
В первом предложении голова имеет то же имя, что и одна из целей - «родитель». В процессе поиска ответа в этой базе знаний будет применено правило «предложение, стоящее первым, будет и применено первым», известное как принцип поиска в глубину. Это приведет к тому, что система будет обращаться только к первому предложению базы знаний и ответ на вопрос
?родитель(Петя);
не будет найден никогда. Вместе с тем небольшое изменение базы знаний, перестановка двух предложений, приводит к удачному поиску решения:
родитель(Коля);
родитель(X)<-родитель(Y),отец(Y,X);
отец(Коля,Петя);
?родитель(Петя);
Неограниченно-повторное обращение к предложению может быть и более замаскированным, как это получается в примере:
выше(A,B)<-ниже(B,A);
ниже(B,A)<-выше(A,B);
выше(Коля,Петя);
?ниже(Петя,Коля);
Однако если третье предложение стоит на первом месте, то повторного обращения не произойдет и ответ будет найден. Такая ситуация называется петлей.
При вычислении элементов последовательности Фибоначчи может появляться бесконечная петля при исполнении программы. В самом деле, если вопрос имеет вид
?Фиб(0,x,y);
то первый возможный результат
x=0,
y=1
Далее в попытке отыскать следующее решение возникает бесконечная петля так как будет отыскиваться
Фиб(-1,x,y), Фиб(-2,…),…
Для контроля за подобной ситуацией необходима модификация базы знаний.
Первые два предложения должны быть записаны в виде
Фиб(0,x,1)<-!;
Фиб(1,1,1)<-!;
тогда при поиске альтернативного решения после получения ответа на вопрос:
?Фиб(0,x,y);
х=0
у=1
будет получен результат: БОЛЬШЕ РЕШЕНИЙ НЕТ. Данный пример иллюстрирует первое возможное использование предиката «отсечение».
Еще одно, чисто эстетическое предложение. База знаний на Прологе-Д будет выглядеть лучше, если предложения с одинаковыми именами расположены в одном месте. Для сравнения приводятся две базы знаний:
1.
мама(Таня,Надя);
бабушка(X,Y)<~мама(X,Z),мама(Z,Y);
мама(Надя,Катя);
2.
мама(Таня,Надя);
мама(Надя,Катя);
бабушка(X,Y)<—мама(X,Z),мама(Z,Y);
Упражнения.
Написать базу знаний, описывающую вычисление факториала.
Написать базу знаний, описывающую вычисление суммы чисел натурального ряда.
Написать базу знаний, описывающую вычисление суммы квадратов чисел натурального ряда.
Описать вычисление наименьшего общего кратного.
Написать базу знаний, описывающую известную притчу «У попа была собака, он ее убил. Она съела кусок мяса, он ее убил, на могиле написал...» и т. д. Как сделать, чтобы эта база знаний не содержала петли?
Написать базу знаний, описывающую сказку о репке, которую тянут-потянут, а вытянуть не могут.
CodeMaster
29.05.2019, 06:59
Извиняюсь, что заучил ;-) но так компактней и информативнее. Дублировать ссылку на zip тоже нет смысла.
Дописываю новую документацию, а пока для истории продолжаю выкладывать старые публикации:
Программа на Прологе представляет собой базу знаний и следующий за ней вопрос. Построению базы знаний посвящена данная статья. Здесь рассматриваются структура программы и некоторые приемы технологии программирования, связанные с использованием встроенных предикатов, рекурсии, графики, специфичные для Пролога-Д. Как и прежде во всех случаях, где это необходимо, будут оговариваться различия Пролога-Д MSX и Пролога-Д БК-0010.
...
Дублировать ссылку на zip тоже нет смысла.Она сама. Я не понял как удалить вложение. Заменял в том сообщении неправильный zip на правильный, но остались оба.
CodeMaster
29.05.2019, 09:20
Я не понял как удалить вложение.
Вложение никак (если оно тут нужно), а дополнительно "Скачать: Prolog-1990-5.zip" писать не надо. Ну, либо "Prolog-1990-5 в различных форматах во вложении".
Вложение никак (если оно тут нужно), а дополнительно "Скачать: Prolog-1990-5.zip" писать не надо. Ну, либо "Prolog-1990-5 в различных форматах во вложении"Так это разные вложения :) То что "Скачать: Prolog-1990-5.zip" - правильное, а то что прилепилось внизу сообщения - неправильное, старое. И я не понял как удалить его.
CodeMaster
29.05.2019, 13:10
И я не понял как удалить его.
Тогда в Расширенный режим -> Управление вложениями, внизу удаляешь его из прикреплённых. И если оно больше нигде не прикреплёно, то через полчаса оно автоматически удаляется из твоей коллекции.
внизу удаляешь его из прикреплённыхВот с этим я и не мог разобраться. Оказывается, надо нажать "управление вложениями" и в новом окне навести на квадратик со вложением, чтобы появился крестик, а потом этот крестик нажать. Ужасающий UI - как можно делать невидимые кнопки в непонятном месте? :)
"Информатика и образование" №6 1990
Скачать: 69223
С. Григорьев
Йошкар-Ола
Графические средства системы Пролог-Д
Практически все современные учебные системы программирования предполагают использование компьютерной графики, она является мощным дидактическим средством. В традиционной компьютерной графике построение изображения на экране интерпретируется серией команд. Таким образом, всякое изображение ассоциируется с алгоритмом его построения и служит для иллюстрации алгоритмического подхода к работе ЭВМ. Однако эта концепция не укладывается в принципы декларативного программирования, принятые в системах логического программирования, к которым относится Пролог-Д. Если последовать концепции логического программирования, то необходимым становится описание элементов рисунка в виде совокупности графических объектов, соотношений и связей между ними. В этом случае описание последовательности действий художника-исполнителя становится излишним (а может ли настоящий художник быть исполнителем?).
В системе Пролог-Д определен набор графических примитивов, отображающих графические объекты и построенных таким образом, что с точки зрения синтаксиса каждый из них может быть только целью и принимает значение «истина» (выполняется), если на экране появляется графическое изображение объекта. При записи в правиле нескольких графических примитивов и выполнении данного правила на экране появляется объединение графических образов в той последовательности, как они описаны в данном правиле.
В системе Пролог-Д БК-0010 предусмотрен один встроенный графический предикат ОТР(x,y,z,t,c). Он выполняется, если на экране генерируется отрезок цвета c, соединяющий точки (x,y) и (z,t). Аргументы x,y,z,t должны быть целыми или переменными, связанными с целыми, причем x, z должны быть в пределах от 0 до 256, а y,t - в пределах от 0 до 512.
В качестве примера приведем описание угла, вершина которого находится в точке (x, y).
угол(x,y)<-ОТР(x,y,10,10,1),ОТР(x,y,50,50,1);
?угол(100,100);
Сначала будет нарисован отрезок, соединяющий точки (100,100) и (10,10), а затем отрезок, соединяющий точки (100,100) и (50,50). Если бы пятым аргументом предикатов ОТР было число, равное нулю, то точки отрезков были бы невидимы.
Не обязательно, чтобы описание всей картинки было записано в одном предложении. Часть описания может быть выделена в виде отдельного предложения. Программу предыдущего примера можно модифицировать:
угол(x,y)<-ОТР(x,y,10,10,1),продолжение(x,y);
продолжение(x,y)<-ОТР(x,y,50,50,1);
?угол(100,100);
Новая программа выполняет те же самые функции.
Система Пролог-Д допускает возможность использования переменных в графических примитивах. В качестве примера приведем описание вектора, выходящего из токи A с координатами (x,y) в точку B с координатами (s,t):
вектор(A(x,y),B(s,t))<-ОТР(x,y,s,t,1);
Необходимо отметить особенность графических объектов, описываемых с помощью переменных. В процессе работы системы может оказаться, что какая-то переменная в описании графического примитива не определена. В этом случае графический примитив все равно будет выполнен, однако переменная принимает все допустимые для нее значения. Иными словами, на экране появится геометрическое место точек, задаваемое уравнением графического объекта. В качестве примера приведем вопрос
?ОТР(0,0,x,100,1);
В результате ответа на этот вопрос на экране появится треугольник белого цвета. Причина этого в том, что величина абсциссы второй точки не определена, в этом случае абсцисса должна быть любым числом, в допустимых пределах. Как правило, область допустимых значений ограничена размерами экрана.
Языковые средства Пролога-Д обеспечивают возможность наращивать определения, естественным путем поддерживают структурность описания объекта. В качестве примера приведем описание построения домика. Домик можно определить как треугольник и квадрат, совмещенные одной стороной. Квадрат можно определить посредством четырех отрезков:
квадр(x,y,z,t)<-ОТР(x,y,x,t,1),ОТР(x,y,z,y,1),ОТР(x,t,z,t ,1),ОТР(z,y,z,t,1);
В этом выражении нет нарушения синтаксиса, однако длина этого предложения больше, чем допустимые 64 символа, и чтобы оно было выполнено в рамках системы Пролог-Д БК-0010, необходимо разделить выражение, например, на две части:
квадр(x,y,z,t)<-ОТР(x,y,x,t,1),ОТР(x,y,z,y,1),ч2(x,y,z,t);
ч2(x,y,z,t)<-ОТР(x,t,z,t,1),ОТР(z,y,z,t,1);
Аналогично определяется треугольник:
треуг(x,y,z,t)<-ОТР(x,y,t,y,1),СЛ(x,t,r),ДЕ(r,2,f),ОТР(x ,у,f,z,1),ОТР(f,z,t,y,l);
Предикат с именем ДЕ - предикат деления первого аргумента на второй, частное в третьем, а предикат с именем СЛ - сложение первого аргумента со вторым, результат в третьем аргументе. К сожалению, и это определение не входит в прокрустово ложе 64 символов. Вот окончательный вариант разделения:
треуг(x,y,z,t)<-ОТР(x,y,t,y,1),ДЕ2(x,t,f),угол(x,y,z,t,f) ;
угол(x,y,z,t,f)<-ОТР(x,y,f,z,1),ОТР(f,z,t,y,1);
ДЕ2(x,t,f)<-СЛ(x,t,r),ДЕ(r,2,f);
Определение дома длиной 20 единиц, высотой этажа 10 единиц и высотой крыши 20 единиц имеет вид
дом(x,y)<-крыша(x,y,r,f),этаж(x,y,f);
этаж(x,y,f)<-СЛ(y,20,z),квадр(x,y,f,z);
крыша(x,y,r,f)<-СЛ(r,10,y),СЛ(x,20,f),треуг(x,y,r,f);
Вновь необходимо разделить это описание на две части: в одной части определяется крыша, а в другой этаж (это тот случай, когда дом приходится начинать строить с крыши).
Использование рекурсивных определений дает возможность записать базу знаний более лаконично. Рекурсия может быть использована и для создания динамически изменяющегося графического объекта. Для этого на одном и том же месте последовательно фиксируется образ объекта так, что цвет его элементов попеременно меняется от цвета фона до цвета, определяемого в базе знаний.
Пример - описание летящей птицы, машущей крыльями. В предикате взмах описан взмах вниз и затем взмах вверх. Первому положению соответствует горизонтальное положение отрезка белого цвета, затем этот отрезок гасится, становится цветом фона. Положению «вверх» соответствует угол, состоящий из двух отрезков белого цвета, которые затем гасятся. Каждое из понятий «вверх» и «вниз» описывается отдельно, при этом производятся арифметические операции, необходимые для вычисления координат начала и конца отрезков. Периодическое повторение взмаха вверх и вниз осуществляется с помощью рекурсивного обращения к одному и тому же предикату птица. (Внимание! В некоторых вариантах транслятора не предусмотрена обработка возникающей в данном примере эффекта концевой рекурсии типа петли Следствием этого может быть аварийный останов после нескольких десятков взмахов). Полное описание птицы, машущей крыльями, приведено ниже.
птица(x,y)<-взмах(x,y),птица(x,y);
взмах(x,y)<-вниз(x,y,1),вниз(x,y,0),вверх(x,y,1), вверх(x,y,0);
вниз(x,y,c)<-сдв(x,y,z,t,u,v),ОТР(z,y,u,y,1);
вверх(x,y)<-сдв(x,y,z,t,u,v),ОТР(x,y,z,t,1),ОТР(x,y,u ,v,1);
сдв(x,t,z,t,u,v)<-сдп(x,y,z,t),сдл(x,y,u,v);
сдп(x,y,z,t)<-СЛ(x,5,z),СЛ(t,5,y);
сдл(x,y,z,t)<-СЛ(z,5,x),СЛ(t,5,y);
Декларативность языка позволяет создавать достаточно сложные картины, используя известные принципы декомпозиции графического объекта на части и последующее их описание.
Например, картина, содержащая дом и летящую птицу, есть пример и описания сложного синтетического объекта, и использования рекурсии для определения динамического изменения объекта.
СЛ(a,b,c)<-ВЫЧ(1,a,b,c);
дом(x,y)<-крыша(x,y,r,f),этаж(x,y,f);
этаж(x,y,f)<-СЛ(y,20,z),квадр(x,y,f,z);
крыша(x,y,r,f)<-СЛ(r,10,y),СЛ(x,20,f),треуг(x,y,r,f);
треуг(x,y,z,t)<-ОТР(x,y,t,y,1),ДЕ2(x,t,f),угол(x,y,z,t,f) ;
угол(x,y,z,t,f)<-ОТР(x,y,f,z,1),ОТР(f,z,t,y,1);
ДЕ2(x,t,f)<-СЛ(x,t,r),ДЕ(r,2,f);
квадр(x,y,z,t)<-ОТР(x,y,x,t,1),ОТР(x,y,z,y,1),ч2(x,y,z,t);
ч2(x,y,z,t)<-ОТР(x,t,z,t,1),ОТР(z,y,z,t,1);
птица(x,y)<-взмах(x,y),птица(x,y);
взмах(x,y)<-вниз(x,y,1),вниз(x,y,0),вверх(x,y,1), вверх(x,y,0);
вниз(x,y,c)<-сдв(x,y,z,t,u,v),ОТР(z,y,u,y,1);
вверх(x,y)<-сдв(x,y,z,t,u,v),ОТР(x,y,z,t,1),ОТР(x,y,u ,v,1);
сдв(x,t,z,t,u,v)<-сдп(x,y,z,t),сдл(x,y,u,v);
сдп(x,y,z,t)<-СЛ(x,5,z),СЛ(t,5,y);
сдл(x,y,z,t)<-СЛ(z,5,x),СЛ(t,5,y);
В ответ на вопрос:
?дом(70,110),птица(120,50);
на экране будет построен дом и нарисована птица, машущая крыльями. Обратите внимание на одно обстоятельство: предикат птица должен быть описан после предиката дом, так как в нем содержится концевая рекурсия типа петли.
В более мощной системе Пролог-Д MSX число встроенных графических предикатов больше. Полный их перечень приведен в таблице. Все аргументы - целые или переменные, конкретизированные целыми.
Функция
Действие
ФОН(T,F)
Установка цвета текста и фона. Переменная конкретизируется целым, соответствующим установленному цвету
ТОЧКА(X,Y,C)
Генерация точки на экране с координатами X, Y и цветом C
ЛИНИЯ(X,Y,U,V,C)
Генерация линии из точки с координатами X, Y в точку с координатами U, V и цветом C
ОКРУЖНОСТЬ(X,Y,R,C)
Генерация окружности радиусом R с центром в X, Y
В качестве примера приведем описание двух синих окружностей с центром в точке с координатами 100 и 100, радиусами 10 и 50:
синие-окружности<-ОКРУЖНОСТЬ(100,100,10,5),ОКРУЖНО ТЬ(100,100,50,5);
?синие-окружности;
Сначала будет нарисована окружность с радиусом 10, а затем окружность с радиусом 50.
Не обязательно, чтобы описание всей картинки было записано в одном предложении. Часть описания может быть выделена в виде отдельного предложения. Программу предыдущего примера можно модифицировать:
синие-окружности<-ОКРУЖНОСТЬ(100,100,10,5),продолж ние;
продолжение<-ОКРУЖНОСТЬ(100,100,50,5);
?синие—окружности;
Новая программа выполняет те же функции. Использование переменных в графических примитивах аналогично использованию в системе Пролог-Д БК-0010.
Обратившись к опыту художников-примитивистов, нарисуем дерево в виде ствола - отрезка линии и кроны - окружности.
дерево(x,y,h,r)<-СЛОЖЕНИЕ(z,h,y),ЛИНИЯ(x,y,z,z,14),С ОЖЕНИЕ(z,r,t),ОКРУЖНОСТЬ(x,t,г,3 );
Если к этому определению в базе знаний задать вопрос
?дерево(50,50,40,10);
то на экране появится одинокое дерево с координатами комеля 50, 50, высотой 40 и радиусом кроны 10.
Языковые средства Пролога-Д обеспечивают возможность наращивания определения, естественным путем поддерживают структурность описания объекта. Использование рекурсивных определений дает возможность записать базу знаний более лаконично.
Построим поляну с деревьями.
сад(1,x,y,h,r)<-дерево(x,y,h,r);
сад(m,x,y,h,r)<-смещение(x,y,z,t),дерево(z,t,h,r),С ЛОЖЕНИЕ(n,1,m),сад(n,z,t,h,r);
смещение(x,y,z,t)<-СЛОЖЕНИЕ(х,10,z),СЛОЖЕНИЕ(у,10,t );
поляна<-ОКРУЖНОСТЬ(v,180,50,2),сад(6,100,150, 50,10),сад(5,85,172,50,10);
Если к этой базе знаний задать вопрос:
?поляна;
то на экране появится искомое изображение.
Поляна изображена с помощью примитива ОКРУЖНОСТЬ, в описании которого не определена одна из координат центра. Это значит, что на экране должны быть нарисованы все возможные окружности, центры которых лежат на горизонтальной прямой, а радиус равен 50. В этом примере использована рекурсия для определения объекта «сад». В нашем понимании сад - несколько деревьев, расположенных на некотором расстоянии друг от друга. Чтобы нарисовать сад, необходимо воспользоваться рекурсивным определением. Оно содержит начальную, или базовую, ситуацию и описание некоторого рекурсивного соотношения. В примере:
базовой ситуацией будет та, когда в саду одно дерево;
рекурсивное определение получится тогда, когда будет несколько деревьев, смещенных относительно друг друга (смещение задано в виде специальной функции, именно она и определяет взаимное расположение деревьев).
Упражнения.
Напишите на языке Пролог-Д базу знаний, описывающую прямоугольный треугольник.
Используя рекурсивное определение, напишите базу знаний, описывающую многоэтажный дом.
Опишите на языке Пролог-Д построение улицы без учета и с учетом перспективы.
"Информатика и образование" №3-4 1992
Скачать: 69220
С. Григорьев
Йошкар-Ола
Пролог-Д в ПЗУ БК-0010
Язык логического программирования Пролог, как показала практика наших публикаций [1, 2], вызывает интерес. Программное обеспечение ПЭВМ «Электроника BK-0010» (правильнее сказать, программное обеспечение КУВТ-86(87) содержит систему Пролог, однако она не была доступна широкому кругу пользователей, особенно обладателям домашних БК-0010.
Совместно с ТЦ ППП «Модус» нами разработана система Пролог-Д, хранящаяся в ПЗУ, непосредственно подключаемом к компьютеру. Входной язык системы полностью совпадает с входным языком, описанным в [2], а возможности (объем исходного текста и глубина рекурсии) значительно шире за счет того, что система хранится в ПЗУ, а не в ОЗУ. Нет, как вы сами понимаете, и проблем с надежностью считывания программы.
К БК-0010 (Фокал) ПЗУ «Пролог» подключается очень просто: устанавливается в розетку ПЗУ пользователя, расположенную в специальном отсеке под отодвигающейся крышкой (рис. 1). При этом важно не перепутать порядок ножек микросхемы. Ножка с номером 1 отмечена на микросхеме стрелкой, а клемма розетки с номером 1 отмечается вырезом на розетке.
69221
Несколько сложнее установить ПЗУ «Пролог» в БК-0010.01 (Бейсик). На месте розетки пользователя в этой машине находятся впаянные микросхемы ПЗУ «Бейсик»; крышка, закрывающая ПЗУ, заклеена. В данном случае ПЗУ «Пролог» устанавливается в блок МСТД в соответствии с рис. 2. На печатной плате блока есть свободное место, на которое припаивается розетка ПЗУ типа РС-24, а в нее вставляется микросхема ПЗУ (последняя не допускает пайки). Розетки РС-24 продаются в магазинах «Радиолюбитель», «Юный техник» и т. п. Впаивать розетку необходимо с учетом номеров клемм, так же как впаяны другие микросхемы на печатной плате МСТД. На рис. 2 цифрами 1 и 2 показана последовательность работ. Для работы блок МСТД подключается к разъему МПИ.
69222
Для запуска системы Пролог необходимо перейти в монитор и после появления приглашения «?» запустить программу нажатием клавиши П.
Для приобретения микросхемы ПЗУ «Пролог» достаточно обратиться в ТЦ ППП «Модус». Стоит она вместе с инструкцией пользователя 200 рублей.
Литература
Григорьев С., Морозов М. Давайте попробуем Пролог // Информатика и образование. 1987. № 4.
Григорьев С. Программирование на Прологе-Д // Информатика и образование 1990. № 4—6; 1991. № 1.
Адрес для справок: ТЦ ППП «Модус», 142500, Московская обл., г. Павловский Посад, ул. Кузьмина, д. 33.
Тел. 8-243-2-22-43 для Москвы, 8-096 43-2-22-43 - для остальных городов.
https://pic.maxiol.com/thumbs/1559764389.531451922..jpg (https://pic.maxiol.com/?v=1559764389.531451922..jpg)
Сергей Михайлович как раз и выдал ППЗУ для обнародования.
Но, видимо, его написание было под контролем мадам на фото :
https://pic.maxiol.com/thumbs/1559492422.531452829.2428.jpg (https://pic.maxiol.com/?v=1559492422.531452829.2428.jpg)
Сергей Михайлович как раз и выдал ППЗУ для обнародования.Круто!
Но, видимо, его написание было под контролем мадам на фотоНа экране будто игра какая-то... А от какой даты газета?
Пролог-Д написан, конечно, глючновато. Поскольку первую версию писали на Бейсике, думаю, на ассемблер потом переводили кое-как.
какой даты газета?
Как-нибуть заберусь в архивы ОКБ Э. поглубже.
Судя по клаве ПКН150-1 и очень молодой мадам - до 1989 г., или даже годом ранее.
Косвенно это можно определить по программе на экране ( первый раз вижу.... ).
- - - Добавлено - - -
Кстати, года с 1993 выходил журнальчик о БК - мадам на фото его редактировала.
А вообще, у госпожи Мочаловой талант писателя - я обычно давал ей краткую табличку команд и параметров, а она сочиняла очень хороший инструктаж по табличке ( к софту ), за что я ей очень благодарен.
года с 1993 выходил журнальчик о БК - мадам на фото его редактировала.
Это который приложение к журналу "Информатика и образование"?
Странно, там Мочаловой нет в списках редколлегии.
Странно, там Мочаловой нет в списках редколлегии
Не читайте советских газет...
Она одна его и писала, а остальные - виртуальные персонажи.
Эдмунд Вилл думаю тоже виртуал
:v2_dizzy_roll:
Не читайте советских газет...
Так других-то нет ... (C)
>Она одна его и писала, а остальные - виртуальные персонажи.
В смысле? Даже все авторы статей - виртуальные? ;-)
И маленький оффтоп: мне в библиотеке (oldpc.su/lib) не хватает хотя бы скана этого журнальчика №1 за 1994. Может кто посодействует. Есть номера на обмен.
Как возник журнальчик о БК ?
Летом 1992 г. спрос на БКшки радикально сократился. Была заказана консультация маркетологов ( да, впервые в СССР Настоящая консультация, а не обнал, как в 99.9% др. "консультаций" ). Маркетологи посоветовали "повысить медийность БК" ( к-во упоминаний в СМИ ), и "лучше освещать в СМИ программный аспект БК" ( не цитаты, но типа такого ). Так же было указано, что в связи с открытием границ совка хлынуло массовое предложение импорта по почти демпинговым ( китайским ) ценам и с гораздо более высокими тех. параметрам, чем БК, в частности изделий на Z80. Соответственно, надо было создать информационный повод для спроса ( рекламу ) БКшек.
Спрос на журнальчик был хороший, в отличии от самих БКшек - в конце 1993 г. было принято решение о остановке их сборки, ввиду полного отсуствия спроса и затоваривания, а так же стабильно отрицательной рентабельности ( в 1993 г. ).
Почему БКшка провалилась в условиях рынка ?
Так кое-кто в 21-м отделе Э. не хотел работать ( увиливал ) от разработки новых образцов БК в период 1987-1991 г., либо делал это экстремально медленно и "неправильно". Т.е. вместо приделывания КМ1801ВМ3А и 0.5 метра ДОЗУ в ~1988-1989 г. была лишь проведена работа по смене ПЗУ в БК11 на вариант БК11М.
Соответственно, БК100, почти готовая в 1993 г., уже на х. никому не нужна была, если только по цене металла. К 1993 г. нужна была машинка уже с 1806ВМ3-8 мгц , да с СОЗУ 0 тактов, хотя бы в младших 64 кбайт АП - так нет же, весь 1992 г. пробегали с Большими кусачками, а в 1993 г. ездили охранять "новых Русских" в Москву.
Летом 1992 г. спрос на БКшки радикально сократился
открытый рынок и не такое снес, консультируюшие маркетологи-лохотронщики наверное деньги взяли за советы, вместо того что бы сказать что "шансов нет"
маркетологи-лохотронщики
Медиа - дело тонкое... Например, чисто на СМИ ( а в последнее время - и на торрентах ( звук )) существуют музыканты, особенно в совке - нет шлейфа упоминаний в СМИ ( медийности ) - нет и спроса на концерты = разорение артиста.
Да и вообще, при рыночной системе общества для сбыта товаров/услуг примерно такая цепочка : - нет рекламы ---> нет сбыта ---> банкротство.
*
сказать что "шансов нет"
Они самые для МЭП/МРП ( бывшего ) СССР закончились году так в 1998-1999 - когда Китай выкатил П-2, способный худо-бедно эмулировать М-ЭВМ с быстродействием 1...2 млн рег-рег ( например, Z80, 1801ВМ2А и т.п. ), или показывать кино МПЕГ-1 320х240.
Примерно так получилось и с Амига-1200 - даже с "вставным мозгом" на ~50 мгц тягаться с П-2 и тем более с П-3 ( 1999 г. ) небыло никакой возможности.
нет рекламы ---> нет сбыта ---> банкротство.
реклама должна учитывать окружающую обстановку всеж, какой то шанс был бы если бы КУВТы на базе БКшек в школах имели бы позиции, но в те времена и в школы приказали ставить писишки насколько помню, при таком можно урекламироваться, но даже интереса среди любителей старины тогда было не получить
КУВТы на базе БКшек в школах имели бы позиции, но в те времена и в школы приказали ставить писишки насколько помню
Там просто элементарно моники фонили по ЭМИ - т.к. МС6105 внутри не содержал жестяного экрана, в отличии от SVGA. По этому реально небыло шансов у МС6105.
Но, примерно в Казани, около 1994-1995 г. были сделаны МС6105 в железном корпусе ( фото могу поискать ), для КУВТов БК, которые делали и в Казани.
В 1995-1996 г. БКшка считалась примерно как "монстр СССР", и народом дружно поливалась дерьмом, с Абсолютным восхвалением Z80, особенно моделей с 512 Кбайт, звуком и дисководом.
А КУВТы в 1996-1997 г. прямо на территории Э. утилировались на драги, корпуса сжигались. А кое-кто корпусами БК0010-01 огораживал клумбы и грядки на даче - нынче даже демонтирует огород и продает отмытые корпуса коллекционерам.
Это малость напоминает анекдотичный случай из судебной хроники начала 21-го века, из провинции :
- примерно в начале 1990-х в совке образовался натуральный голод, и народ стал совершать набеги на сады-огороды - картошку там выкапывать по ночам, даже лук выдергивали и т.п. Был один ветеран-завхоз на крупном оборонном заводике - и в его закромах нашлась большая деревянная катушка "железной" проволоки, типа "нержа", которую он и прикатил себе на дачу. Поставил, значит, столбов по периметру огорода, да и накрутил почти всю огромную катушку - заборец вышел отличный. Так защита от "синяков" действовала примерно до начала 21-г века, пока оборонное предприятие не испустило дух, и его купил ( за бесценок ) какой-то москвич. Первое, что сделал москвич - провел учет ценностей. На складу числилась бобина ~5 тонн платиновой проволоки, в наличии таковой не оказалось. Пришли "братки" к уже тогда безработному завхозу - "где 5 тонн платины ?". Завхоз полдня терпел пытки, пока не сообразил, что за проволока использована в заборе... Собрали проволоку, даже из общественного колодца срезали - всё сошлось до грамма.
Написал, наконец, свой "учебник" по Прологу-Д. Не буду прятать под спойлер, нужная вещь - пускай будет на виду.
В комплекте помимо PDF, DOC, ePUB ещё и сам исполняемый файл Пролога-Д с примерами программ и документацией в формате БК. Проверено на БК 0010 и БК 0011М с контроллерами SMK.
Скачать: 69267
А. Мачуговский
Москва
Пролог-Д для БК 0010 и БК 0011М
Введение
Первая версия языка программирования Пролог-Д для компьютера БК-0010 была выпущена в 1987-ом году С. Григорьевым. Версия 1.1 появилась, вероятно, в 1992-ом году. Она прошивалась в ПЗУ и для сохранения (а также загрузки) программ использовала магнитофон. По сравнению с предыдущими версиями, оставляла больше места для стека и для программы пользователя.
В 2019-ом году ПЗУ-версия была адаптирована для запуска в операционных системах MKDOS и ANDOS на БК-0010.01 и БК-0011М с контроллером жёсткого диска SMK. Для работы использует расширенную память контроллера. Адаптированный Пролог-Д можно загрузить и с магнитофона (при этом БК 0011М должна быть переведена в режим БК 0010 предварительной загрузкой в память Монитора от БК 0010).
Редактирование текста
После запуска Пролог-Д находится в режиме «Редактирование».
Текстовый редактор не поддерживает автоповтор при удержании клавиши. Используйте клавишу ПОВТ. Помимо клавиш управления курсором, обрабатываются клавиши «забой», «сдвижка», «раздвижка» и «удаление до конца строки».
Максимально допустимая длина строки - 64 символа.
Нажатие клавиши КТ переводит в режим ожидания команды пользователя. Всего доступно три команды, они вызываются клавишами «Ч» и «З» в русском заглавном регистре и клавишей «?». Если нажата иная клавиша, она обрабатывается как обычно. После обработки команд пользователя возврат в режим редактирования происходит по нажатию любой клавиши. Команды:
? - вызов подсказки (довольно бесполезной).
Ч - чтение программы с кассеты или диска. Завершение чтения никак не обозначается.
З - запись программы. Рекомендуется использовать расширение файла «.PL»
Основы языка
Программу составляют из фактов и правил. В каждой строке можно указать только один факт или одно правило. Строка должна заканчиваться символом “точка с запятой”.
Пример фактов:
RUSENG(РАДОСТНЫЙ,GLAD);
RUSENG(РАДОСТНЫЙ,SUNNY);
RUSENG(СОЛНЕЧНЫЙ,SUNNY);
RUSENG(СОЛНЕЧНЫЙ,SOLAR);
RUSENG(СОЛНЕЧНЫЙ,SHINY);
RUSENG(БЛЕСТЯЩИЙ,SHINY);
Текстовые значения записываются в Прологе-Д без кавычек. Регистр учитывается, apple и APPLE - два разных значения. Важно придерживаться выбранного порядка объектов. В данном случае первым всегда указано русское слово, вторым - английское.
Пример правила:
СИНОНИМ(X,Y)<-RUSENG(X,Z),RUSENG(Y,Z);
RUSENG и СИНОНИМ - имена созданных программистом предикатов. В терминологии Пролога предикат - утверждение, задающее отношения между объектами. Первый пример показывает создание предиката RUSENG и наполнение его фактами из русско-английского словаря. Во втором примере создан предикат СИНОНИМ, описывающий правило нахождения синонимов для русских слов. Это правило гласит: для русских слов X и Y существует такое английское слово Z, что X переводится как Z и Y переводится как Z.
После имени предиката всегда пишут скобки (даже если предикату не нужно передавать никаких объектов).
Предикат - логическая величина, она принимает значения ДА или НЕТ. Предикат может содержать несколько фактов и/или правил.
Факт всегда выдает значение ДА.
Правило в левой части содержит имя и список объектов. При дальнейшем использовании правила важно придерживаться выбранного порядка объектов. Справа от символов <- идет описание правила: через запятую перечислены предикаты (факты и правила), их ещё называют
целями. Когда все они принимают значение ДА, тогда и само правило выдает значение ДА. По сути, символ «,» между предикатами обозначает логическую операцию И.
Описание целей допускает рекурсию, то есть при необходимости в описании правила можно использовать имя самого это правила.
Совокупность фактов и правил называют базой знаний.
Вопрос записывают последней строкой программы и обозначают символом “?”. Его можно писать слитно со следующим за ним предикатом (фактом или правилом), а можно и через пробел. Пролог-Д ответит на вопрос, учитывая перечисленные выше факты и правила. Программа может содержать только один вопрос. Следующие за ним строки программы игнорируются.
Пример вопроса:
? RUSENG(СОЛНЕЧНЫЙ,SAD);
В данном примере Пролог-Д проверит предикат RUSENG на содержание факта «значению СОЛНЕЧНЫЙ соответствует значение SAD». Такого факта нет в базе знаний, поэтому ответ на вопрос - НЕТ. Он и появится на экране.
Переменные в Прологе-Д однобуквенные - строчные и заглавные символы от A до Z и от А до Я. Поэтому внести в наш англо-русский словарь значения «I» и «Я», к сожалению, не получится. Область видимости переменной - одна строка. Можно использовать одинаковые имена переменных при создании разных правил. Для простых правил традиционно используют переменные X, Y и Z.
Вопрос с использованием переменной Y:
? RUSENG(СОЛНЕЧНЫЙ,Y);
Пролог-Д рассмотрит записанные в базе знаний факты и напечатает на экране все подходящие значения переменной Y:
Y=SUNNY
Y=SOLAR
Y=SHINY
ДРУГИХ РЕШЕНИЙ НЕТ
Технически это работает так. Факт RUSENG задает отношение между двумя объектами. Пролог-Д синтезирует новые факты: на место первого объекта подставляет значение «СОЛНЕЧНЫЙ», на место второго объекта по очереди подставляет все возможные (известные из фактов о RUSENG) значения второго объекта. Как только обнаружено, что синтезированный факт совпадает с одним из фактов базы знаний, решение считается найденным. Тогда текущее значение второго аргумента записывается в переменную Y и выдается на экран. После этого поиск решений (синтез и сравнение фактов) продолжается до исчерпания базы знаний, так как верных ответов может быть несколько.
Запуск и выполнение программы
Нажатие клавиши ВВОД на строке с вопросом запускает выполнение программы. После этого Пролог-Д переходит в режим «Выполнение»: экран очищается и выводятся все найденные решения. Нажатие любой клавиши возвращает в режим «Редактирование».
Напомним описание правила и приведем вопрос, содержащий это правило:
СИНОНИМ(X,Y)<-RUSENG(X,Z),RUSENG(Y,Z);
? СИНОНИМ(СОЛНЕЧНЫЙ,Y);
Результат выполнения программы:
Y=РАДОСТНЫЙ
Y=БЛЕСТЯЩИЙ
ДРУГИХ РЕШЕНИЙ НЕТ
Хотя для пользователя обработка фактов и правил выглядит одинаково, технически второе немного сложнее. Описание правила СИНОНИМ использует два факта RUSENG с разными переменными, поэтому вычисляться они должны независимо - в данном случае Пролог-Д синтезирует сразу два факта и сверяет их с фактами из базы знаний. Затем к результатам применяется логическая операция «и». На место переменной X всегда подставляется значение «СОЛНЕЧНЫЙ». На место переменных Y и Z по очереди будут подставлены все известные о RUSENG факты (согласно описанию правила СИНОНИМ, на место Y подставляются значения первого объекта RUSENG, на место Z - значения второго объекта RUSENG). Для каждого синтезированного набора фактов Пролог-Д вычислит логическое значение предиката СИНОНИМ и в случае получения истины сочтет текущее значение переменной Y подходящим ответом. После чего продолжит поиск.
Базовые логические операции
Создадим предикат EQ, который с помощью переменной Z опишет эквивалентность (равенство) двух объектов:
EQ(Z,Z);
Зададим вопрос:
? EQ(3,3);
Пролог-Д ищет в программе предикат EQ и подставляет в него значения обоих аргументов (числа 3 и 3), после чего проверяет, верно ли, что оба значения можно одновременно представить одной и той же переменной Z. Ответ - ДА.
Теперь зададим вопрос:
? EQ(3,4);
Очевидно, значения 3 и 4 не могут быть одновременно представлены одной и той же переменной Z, поэтому ответ - НЕТ.
Следующий вопрос:
? NOTEQUAL(3,4);
Предикат с именем NOTEQUAL не описан в программе, Прологу-Д о нем ничего не известно. В таких случаях в Прологе принято выдавать ответ НЕТ.
Отрицание. В Прологе-Д есть встроенный предикат НЕ с одним аргументом. Дополним наше правило СИНОНИМ, чтобы слово не считалось синонимом самому себе. Для этого понадобится предикат EQ и встроенный предикат НЕ:
EQ(Z,Z);
СИНОНИМ(X,Y)<-НЕ(EQ(X,Y)),RUSENG(X,Z),RUSENG(Y,Z);
Первая цель правила СИНОНИМ гласит, что X и Y не должен быть эквивалентны. Для ускорения работы программы полезно первыми записывать простые цели. Пролог-Д просматривает цели слева направо, и как только встречает цель, выдающую ответ НЕТ, заканчивает обработку значений (и переходит к поиску других решений, если в вопросе содержатся переменные). Сложные для вычисления цели лучше записывать последними, надеясь на то, что до их обработки дело не дойдет. Впрочем, баланс между быстродействием и удобочитаемостью программы каждый программист определяет для себя сам.
Или. В Прологе-Д нет отдельного символа для обозначения логической операция «или». Вместо этого отношение «или» задают наполняя предикат несколькими правилами:
ДАЛЬНИЙРОДСТВЕННИК(X,Y)<-ТЕТЯ(X,Y);
ДАЛЬНИЙРОДСТВЕННИК(X,Y)<-ДЯДЯ(X,Y);
ДАЛЬНИЙРОДСТВЕННИК(X,Y)<-ПЛЕМЯННИК(X,Y);
Отсюда получается: если у человека есть тетя или дядя, значит у него есть дальний родственник.
Отсечение. Обозначается знаком «!». Иногда нужно прекратить дальнейший поиск решений, когда одно решение уже найдено. Для примера дополним определение СИНОНИМ ещё одной целью и зададим вопрос:
СИНОНИМ(X,Y)<-НЕ(EQ(X,Y)),RUSENG(X,Z),RUSENG(Y,Z),!;
? СИНОНИМ(СОЛНЕЧНЫЙ,Y);
Как уже было сказано ранее, Пролог-Д рассматривает цели слева направо. Когда в процессе перебора фактов X и Y принимают равные значения, предикат НЕ(EQ(X,Y)) выдает НЕТ и поиск текущих значений X и Y в словаре RUSENG не производится. Когда же первые три цели выдают значение ДА, Пролог-Д переходит к обработке четвертой цели. А в данном случае это «!» - отсечение. Предикат отсечения заканчивает обработку правила, целью которого является. Таким образом, правило СИНОНИМ, дополненное оператором отсечения, выдаст только одно, первое найденное, решение. После этого обработка прервётся.
Цель «!» не обязательно должна стоять последней, после неё можно указать и другие цели. Пока они принимают значение ДА, обработка не прерывается. Как только хотя бы одна из целей справа от «!» примет значение НЕТ, обработка прекратится.
Важно заметить, что прекращается поиск решений только для конкретного, обрабатываемого в данный момент правила, а не для всей программы. Таким образом, предикат отсечения удобно использовать, в частности, для выхода из рекурсии.
В реализации Пролога-Д внутреннее устройство факта и правила одинаково. Факт – это правило, не зависящее ни от каких целей. Поэтому следующие две записи равнозначны:
МАМА(ЛЕНА,ВАНЯ);
МАМА(ЛЕНА,ВАНЯ)<-;
Это даёт нам возможность применить к факту предикат отсечения, который пояснит, что у человека может быть только одна мама (если найдена одна, других искать не надо):
МАМА(ЛЕНА,ВАНЯ)<-!;
Предикат отсечения нельзя использовать в вопросе. Он допустим только в определении правила.
Арифметические операции
Вся арифметика в Прологе-Д целочисленная, переменные могут принимать только положительные 16-разрядные значения в диапазоне от 0 до 65535.
Для понимания арифметических вычислений в Прологе-Д рассмотрим уравнение двух переменных в форме линейной функции:
k * x + m = y
По какой-то причине страсть к математическим абстракциям привела создателей языка именно к такому виду вычислений: все базовые арифметические операции на Прологе-Д выражаются через линейную функцию. При k=1 мы получаем сумму x и m в переменной y. При m=0 мы получаем произведение k и x в переменной y. В свою очередь, k содержит результат деления y на x если m=0. Ну а разность y и x получается в m если k=1.
Для вычисления линейной функции в Прологе-Д есть предикат ВЫЧ:
ВЫЧ(K,X,M,Y);
Чтобы произвести сложение, вычитание, умножение или деление, программисту нужно составить линейную функцию с соответствующими аргументами.
Допустим, нам нужно узнать результат деления 35 на 7. Линейная функция будет выглядеть так:
7 * x + 0 = 35
Соответствующая запись на языке Пролог-Д и результат обработки вопроса:
? ВЫЧ(7,X,0,35);
X=00005
ДРУГИХ РЕШЕНИЙ НЕТ
Иными словами, в Прологе-Д отсутствуют привычные операторы + - / * и все вычисления производятся с помощью предиката ВЫЧ.
Создадим более удобный предикат для возведения в квадрат переменной X. Ответ будет помещён в переменную Y:
QUAD(X,Y)<-ВЫЧ(X,X,0,Y);
Иногда по какой-то причине Пролог-Д может выдать три одинаковых ответа на вопрос:
? QUAD(3,Y)
Y=00009
Y=00009
Y=00009
ДРУГИХ РЕШЕНИЙ НЕТ
Чтобы исправить эту оплошность, добавим в описание предикат отсечения:
QUAD(X,Y)<-ВЫЧ(X,X,0,Y),!;
Теперь ответ будет только один.
Хотя философия языка это подразумевает, в реализации Пролог-Д мы, к сожалению не сможем узнать ответ на вопрос:
? QUAD(X,16);
ОШИБКА 34
НЕТ
Сравнение. В Прологе-Д нет встроенных средств для сравнения чисел, но их можно создать, используя лишь логику и математическую индукцию – в этом философия и суть Пролога. Помня о том, что Пролог-Д работает с положительными целыми числами, запишем правило: при сравнении с нулем любое число X выдаст ДА, если только само это число X не равно нулю:
БОЛЬШЕ(X,0)<-НЕ(EQ(X,0)),!;
Предикат EQ должен быть определен как было показано ранее. Предикат отсечения «!» нужен для дальнейшего использования в ещё одном правиле: если X > Y, то верно и неравенство X-1 > Y-1. Будем отнимать по единице до тех пор, пока не выполнится одно из условий:
1. Второй аргумент сравняется с нулем. Тогда сработает записанное выше правило, оно выдаст ответ ДА и остановит перебор благодаря оператору отсечения.
2. Первый объект сравняется с нулем. Соответствующее правило опишем ниже, оно должно выдавать ответ НЕТ и также останавливать перебор.
Второе правило выглядит так:
БОЛЬШЕ(X,Y)<-НЕ(EQ(X,0)),ВЫЧ(1,U,1,X),ВЫЧ(1,V,1,Y),!,Б ОЛЬШЕ(U,V);
Оно выполняется пока X не равен нулю. В переменную U записываем X-1, в переменную V записываем Y-1. Нам нужно чтобы предикат БОЛЬШЕ вычитал единицы и вызывал сам себя. Выход из рекурсии (череды самовызовов) произойдет когда X сравняется с нулем. Тогда предикат БОЛЬШЕ справа от символа «!» выдаст НЕТ и на этом обработка закончится.
К сожалению, Пролог-Д не справится с обработкой этим методом больших чисел, так как он потребует глубокого погружения в рекурсию.
Для решения этой проблемы перейдём от вычитания единиц к делению пополам. Правда, Пролог-Д не может решить задачу деления нечётного числа на 2, ведь ответ не принадлежит множеству целых чисел. Поэтому нам придется определить предикат HALF (половина):
HALF(A,B)<-ВЫЧ(2,B,0,A);
HALF(A,B)<-ВЫЧ(2,B,1,A);
В зависимости от чётности числа A, одно из правил выдаст ответ НЕТ, зато другое найдёт целое число. Оно и станет решением предиката HALF.
Будем производить деление пополам до тех пор, пока первый объект не станет на единицу больше второго, либо первый объект сравняется с нулем. В первом случае ответ ДА, во втором – НЕТ.
БОЛЬШЕ(X,Y)<-ВЫЧ(1,Y,1,X),!;
БОЛЬШЕ(X,Y)<-НЕ(EQ(X,0)),HALF(X,U),HALF(Y,V),БОЛЬШЕ(U,V );
Операция деления выполняется дольше, чем вычитание единицы, но ответ получается за меньшее число шагов (для 16-разрядных чисел максимум за 16 рекурсивных вызовов).
Графические возможности
В Пролог-Д встроен предикат ОТР для рисования отрезков в чёрно-белом режиме 512 на 240 точек. Левому верхнему углу экрана соответствуют координаты 0,0.
ОТР(A,B,X,Y,1)
Предикату ОТР передают 5 объектов. Первые два - горизонтальная и вертикальная координаты начальной точки. Следующие два объекта - координаты конечной точки. Пятый объект должен принимать либо значение 1 (отрисовка отрезка), либо 0 (стирание). Когда координаты начальной и конечной точки совпадают, длина отрезка равна нулю (он не рисуется).
Координата может быть одного из трёх типов:
Число
Переменная, которая не используются нигде, кроме предиката ОТР
Переменная, значение которой вычислено Прологом-Д
В первом случае предикат нарисует один отрезок и вернёт ДА.
Во втором случае Пролог-Д, выполняя предикат ОТР, по очереди подставит на место неопределённой переменной все возможные значения (от 0 до 511 для горизонтальной координаты, от 0 до 239 для вертикальной). Только после того, как нарисовано всё множество отрезков, предикат закончит работу. Ответ ДА.
В третьем случае, если Пролог-Д не нашёл решения для переменной, отрезок не будет нарисован, а предикат ОТР выдаст ответ НЕТ. Если решение найдено, отрезок отобразится, ответ ДА.
После нахождения каждого решения для правила, содержащего один или несколько предикатов ОТР, Пролог-Д показывает текстовый курсор и ожидает нажатия любой клавиши, затем очищает экран и печатает решение. Повторное нажатие клавиши возвращает Пролог-Д к дальнейшему поиску решений.
Примеры трёх вопросов с разными типами координат:
? ОТР(0,120,511,0,1);
? ОТР(0,120,511,Y,1);
? ВЫЧ(A,2,1,511),ОТР(A,120,511,0,1);
В первом случае будет нарисован один отрезок. Ответ ДА.
Во втором случае отобразится множество отрезков, складывающихся в закрашенный треугольник. Ответ ДА.
В третьем случае Пролог-Д сначала вычислит значение переменной A, а затем предикат ОТР проведёт один отрезок из точки с координатами 255,120. Ответ после очистки экрана:
A=00255
ДРУГИХ РЕШЕНИЙ НЕТ
Если в третьем вопросе поменять местами предикаты ВЫЧ и ОТР, то к моменту выполнения ОТР значение переменной A ещё не будет вычислено.
? ОТР(A,120,511,0,1),ВЫЧ(A,2,1,511);
По умолчанию значение переменной считается равным нулю, поэтому отрезок будет нарисован из точки с координатами 0,120 и только после этого Пролог-Д посчитает значение переменной A.
Одновременное использование всех трёх типов объектов:
? ВЫЧ(A,2,1,511),ОТР(A,120,511,Y,1);
Из точки 255,120 будут проведены отрезки в множество точек с координатами 512,Y (где Y последовательно примет значения от 0 до 239). После появления текстового курсора, нажатия клавиши и очистки экрана будет напечатан ответ:
A=00255
Y=_1
ДРУГИХ РЕШЕНИЙ НЕТ
Для Y выводится, по-видимому, индекс этой неопределённой переменной.
Теперь создадим предикат DOT и наполним его фактами о координатах точек:
DOT(256,40);
DOT(142,100);
DOT(370,100);
DOT(184,190);
DOT(328,190);
Зададим три вопроса. Первый выдаст ответ ДА, второй - НЕТ:
? DOT(142,100);
? DOT(14,10);
? DOT(A,B),DOT(C,D),ОТР(A,B,C,D,1);
Третий вопрос приведёт к такому поведению Пролога-Д: из базы знаний будет выбрана первая пара точек (они окажутся одинаковыми) и нарисован отрезок между ними (для одинаковых точек это отрезок нулевой длины). Затем после нажатия клавиши экран очистится и появится ответ:
A=00256
B=00040
C=00256
D=00040
Нажав клавишу ещё раз, мы позволим Прологу-Д продолжить поиск решений. Из базы знаний будет выбрана следующая пара точек и нарисован отрезок между ними. Однако, на экране всё ещё останется предыдущий ответ. Раз за разом нажимая клавишу, мы будем видеть следующий отрезок, но предыдущие значения переменных A, B, C, D. Когда все возможные сочетания координат из базы знаний будут перебраны, появится ответ:
ДРУГИХ РЕШЕНИЙ НЕТ
Для того, чтобы рисовать отрезки не по одному, а все сразу, создадим правило STAR и запустим его на выполнение, задав вопрос:
STAR()<-DOT(A,B),DOT(C,D),ОТР(A,B,C,D,1),NO();
? STAR();
Последний предикат NO нигде не описан, поэтому он всегда будет выдавать НЕТ, а значит и всё правило STAR тоже примет значение НЕТ. Даже найдя в базе знаний факты и нарисовав отрезок, Пролог-Д будет считать, что ответ на вопрос ?STAR не получен, поэтому не напечатает на экран значения переменных A, B, C, D и продолжит искать ответы. Когда база знаний будет исчерпана, Пролог-Д покажет текстовый курсор, а после нажатия клавиши - ответ НЕТ. Ведь предикат STAR так ни разу не принял значение ДА.
Как уже было сказано выше, правило может содержать несколько предикатов ОТР, а также другие правила, которые включают предикат ОТР. Это позволяет рисовать довольно сложные картины. Стирая отрезки, можно добиться даже некоторого подобия анимации.
Упражнения
Объясните работу программы нахождения N-го числа Фибоначчи:
ФИ(1,1)<-!;
ФИ(2,1)<-!;
N1(N,A)<-ВЫЧ(1,A,1,N);
N2(N,B)<-ВЫЧ(1,B,2,N);
ФИ(N,F)<-N1(N,A),N2(N,B),ФИ(A,X),ФИ(B,Y),ВЫЧ(1,X,Y,F );
? ФИ(7,F);
Напишите программу, вычисляющую факториал числа N.
тут есть oldpc.su/lib , там все в процессе допиливания и дополнения, но нужные журналы вроде доступныа нет случайно документации по БК-шной версии языка Forth?
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot