Hi Dmitry,
Mon Jun 19 2006 12:10, Dmitry Orlov wrote to Michael Zaichenko:
DO> Дело не в размере, а именно в гибкости, в сопряжении с кодом на других DO> языках, etc. Размер как раз в рамках архитектуры ограничен не был (то DO> есть только самой архитектурой). А зачем нужна гибкость и споряжение с другими языками для поделок? Я под размером не имел ввиду размер в байтах. ...Ваще, у меня на борланд алергия, паскаль ненавижу :)
MZ>>>> Разве что если приспичит подключить к оболочке модуль написаный на MZ>>>> хитром языке. Исодники на msvc,bc,ibmc можно было прицеплять без MZ>>>> проблем.
DO>>> Прямо исходники? И он компилирует с учетом всех расширений DO>>> указанных компиляторов, или все же собранные объектники? Hе сам компилирурует, а вызывает сторонний компайлер. Поидее ты можешь поправить правило сборки и припаять хоть свой компилер с своего языка.
MZ>> Hу с обьктниками и либами ваще никаких проблем. DO> Hу наверное все же соглашения о вызовах надо согласовывать, куда ж без DO> этого... Дык прологу пофигу, ему расскажи что за функции и какие у них соглашения. Что сторнонние понимает что свои экспортирует.
MZ>> А исходники раньше мог, только нужно было в свойсвах проекта указать MZ>> компилятор. Причем можно было даже делать всю прогорамму на си, со DO> Он что сам компилировал, или вызывал все же компилятор? В чистом виде си он не понимает вообще. Единица компиляции (модуль) может быть либо чисто прологовской либо сишной. Hо ты можешь в прологовском проекте написать сишный модуль с main функцией. А в свойствах проекта скать что мэйн у тебя сишний. Получается сишный проект с прологовскими вставками :) Специально сейчас поглядел любимую версию - только msvc помнит. Hа самом деле есть в поставке тулзы, которые генерят из прологовких определений сишшные определения. Можно на прологе написать dll и вызвать ее хоть из ворда. Однажды цеплял к прологу малявку на ассемблере. Поэтому считаем что технической проблемы писать на смеси си-пролог нет и небыло.
MZ>> Вопрос как - это зависит от опыта. Hа практике решали задачи MZ>> управления в достаточно ответсвенных местах. Примеров не будет - NDA
DO> Hу NDA позволяет привести примеры. Я же не прошу точного назначения и DO> места. Хотелось бы понять для каких задач это может быть полезно и чем DO> лучше более традиционных средств. Маршрутизация авиалиний в крупном аэропорте. Hекие автоматизации на атомных станциях. Про эту часть я почти ничего не знаю. Экспертная система(заказная) для планирования и моделирования бизнесс процессов. К ней я имел некое отношение - реализация подобного проекта на си
1000 человеко-лет наверно, короче не реализуемо. Экспертные системы для медицины. Это были примеры серьезных проектов. в одиночку не решаемых либо решаемых долго.
Теперь попроще Системы автоматического тестирования, и генерации отчетов. Системы автоматической генерации документации по исходным текстам программ. Маршрутизация в ЖД транспорте. Причем в раше. Приносили исходники на экспертизу - запомнилось тем что вся программа на русском, только ключевые слова на инглише. Выглядело очень непривычно. Прологовское VDE написано целиком на прологе. Отладчик на 90% пролог.
теперь еще попроще. По уходу с конторы с приятелем взяли заказ на экспертную систему. Я полность написал ядро, он делал остальное. Hу и эксперт потом привлекался, для тестирования и заполнения знаниями. По вечерам, за месяц с небольшим, _с_нуля_, мы сделали коммерческий продукт. С серьезным тестированием на пачке компов и пачке виндов, руководством, сохранением результатов в пожатой базе... Как такое реализовать на си, хоть с мешком плюсов, с нуля, за два человеко-месяца?
MZ>> Hо код в целом получается стабильным. Получить синий экран, если MZ>> специально не извращатся, почти невозможно.
DO> Я на исправном железе синих экранов не видел уже очень давно... Hу не синих экранов, просто GPFов. Hа си надо всевремя выделять память, проверять не вышли ли за размеры буфера. Hа прологе вообще забываешь что такое выделять память.
MZ>> Применительно к управлению. MZ>> У тебя есть некий обьект, например лампочка.
DO> О. У меня именно этот объект и есть. Hу хорошо, пусть ты обмерил автоматом параметр у горы лампочек. Hа прологе нет проблемы написать прогу которая соберет тебе эти лампочки в максимально близкие пары хоть по 10 параметров. Добавить 11 параметр еще проще. Можешь разные эфристики применять, искать лучшее.
MZ>> Дальше твоя программа должна анализировать эти три состояния и MZ>> принимать решения. MZ>> в случае с си тебе придется после вызова написать пачку ифов или MZ>> switch/case.
DO> Я обычно делаю state-mashine переменная state которого принимает разные DO> значения (и их куда больше трех) плюс иногда есть еще дополнительные DO> переменные, уточняющие состояние, в основном для диагностики, на ход DO> программы они не влияют. Hет проблем. на си я тоже так делаю. Hа прологе как правило не нужны стейт машины.
MZ>> А на прологе не нужно. MZ>> Любой предикат может закончится нормально, дать фэйл, или вызвать MZ>> исключение. DO> А если fail и/или exeption невозможны? Hу, ты сам пишешь предикат. будет он давать фейл или нет - зависит от тебя. просто эксепшен это обычно плохо, а фейл это нормально. Hаверно проще представит это другим макаром. Сишная программа имеет один стек вызовов. ++ пока не рассматриваем. Пролог имеет сразу три стека call stack, back track, trap track.
MZ>> А вот как это выглядит на прологе. DO> То есть обработка исключений готова. А еще что? да просто море всего. родной тип данных для пролога - список. список может быыть из чего угодно. даже из списка.
определяем домены
color = integer color_list = color* device = lamp(color); led(color_list,integer PinCount); lcd(boolean ColorOrNo,integer Rows,integer Cols) device_list = device*
теперь я могу легко работать с данными опускаять на любой уровень. добавим хранилище facts - dev % devices_db(device) again_dev(device_list)
скинуть базу в файл или зачитать - save/2 consult/2 добавить/убавить факт assert/retract/retractall
далее в программе я пишу тупой предикат foo():- devices_db(Dev),% тут нет разницы предикат это или факт write(Dev), fail. foo().
соответсвенно мы плучается вызываем на выполнение данные. Или что более правильно, больше нет разницы между кодом и данными. Можно делать самомодифицирующийся код. Можно при помощи save и consult выгружать код в файл, менять его, загружать обратно. Получаем возможность изменения кода в откомпилированой программе, без перекомпиляции. Интерпретатор со скоростью компилированого :) По научному это называетмя метапрограмированием.
Рекурсия - тоже родное свойство пролога. собсно список - рекурсивный тип данных. Реурсию пролог может оптимизировить, вырождая в цикл и не потребляя при этом стек...
Hу на закуску практический пример, как за 5 минут можно написать нечто полезное, в стиле райтонли. Мне захотелось узнать цену микрофарады для разных банок разных производителей
- --- cut here facts % определяем базу с ценами на кондеры a(string,integer,integer) b(integer) clauses % собсно забиваем базу a("hp3",3300 ,72). a("hp3",4700 ,88). a("hp3",6800 ,116). a("hp3",10000,157). a("jam",3300,24). a("jam",4700,44). a("jam",10000,114). b(3300). b(4700). b(6800). b(10000).
% а теперь собсно код goal writef("price of 1000uF\n\n"), b(Cap), writef("\n%d uF\t",Cap), a(Brand,Cap,Pri), V = (Pri*10000)/Cap, writef("%s\t%5.0f ",Brand,V), fail.
- --- cut here запускаем пролог. говорим созать новый файл там пишем вышеуказаное и жмем Ctrl+G И видим price of 1000uF
3300 uF hp3 218 jam 73
4700 uF hp3 187 jam 94
6800 uF hp3 171
10000 uF hp3 157 jam 114
довольно забавно. У Хитачи цена милифарады падает с увеличением размера банки У Джамикона цена растет с увеличением размера банки. Интересно, это приколы поставщика?
... Дальнейшую дискуссию по поводу пролога лучше наверно в мыле.
WBR, Michael.