2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Логическое программирование на Пролог
Сообщение08.04.2006, 18:41 
Аватара пользователя
У меня появилась необходимость его изучения.
Первоначальное неглубокое знакомство приводит к неутешительному выводу об его относительной бесполезности - ложный ход в индустрии языков программирования. Возникает очевидный вопрос - под какие практические задачи, кроме экзотики типа задачи Эйнштейна, ничего в голову не приходит.
Очень хотелось бы узнать мнения других людей.

 
 
 
 Re: Логическое программирование на Проглог
Сообщение08.04.2006, 20:58 
Абсолютно полезными можно считать десяток-полтора языков мэйнстрима, на которых пишут сотни тысяч специалистов. Остальные несколько сот, в т.ч. Пролог, можно считать относительно бесполезными.

Ложным ходом я бы его не стал называть, вердикт пока не вынесен. Ведь системы логического вывода из аксиом реализуются, в той или иной степени, в любой системе искусственного интеллекта. А Пролог - это "чистая" реализация логического программирования. Предназначался и применялся для исследований в области ИИ, в т.ч., понимания естественных языков. Эдинбургская реализация Пролога считалась эталоном для СЛВ. Мода на него, как и на ИИ в целом, прошла. Возродится ли - кто знает.
Кстати, один из моих коллег, Electrical Engineer, изучал в колледже Бейсик и Пролог. Правда на работе он программирует только на Basic.

А вот теперь и у Вас возникла необходимость его изучения...

 
 
 
 
Сообщение09.04.2006, 02:51 
Цитата:
Мода на него, как и на ИИ в целом, прошла


Мода на ИИ не прошла, просто вместо предмета всеобщего (обычно некомпетентного) восхищения ИИ теперь стал одной из многих прикладных частей Computer science. Например, программисты занятые ИИ - одни из наиболее оплачиваемых в индустрии компьютерных игр. Об использовании Пролога в прикладных системах я не слышал, но это не означает что он там не используется.

Конечно, Пролог сам по себе может быть в настоящий момент довольно бесполезным язком. Просто к его изучению надо подойти в контексте. Пролог это пример СЛВ (системы логического вывода) с backward inference, в то время как экспертные системы обычно используют forward inference. Если разные прикладные СЛВ изучать вкупе, то такие затраты времени могут себя вполне окупить в будущем.

 
 
 
 
Сообщение10.04.2006, 23:54 
Аватара пользователя
Спасибо ВСЕМ за ответы! Видимо диагноз относительной бесполезности оправдывается...

 
 
 
 
Сообщение04.05.2006, 01:44 
Ну-ну, попробуйте это сказать на каком-нибудь из форумов, посвящённых Прологу - там вам убедительно докажут, что на Прологе можно делать абсолютно всё, совершенно отказавшись от обычных императивных языков :) На самом деле, высказывания о глобальности и бесполезности Пролога - это 2 крайности, между которыми находится истина. Мне пришлось с нуля изучать Пролог 5 лет назад, когда меня кинули это дело преподавать. Могу кое-что сказать по своему опыту. У Пролога действительно есть своя область практического применения. она не очень широкая, обобщённо её можно назвать решением переборных задач, имеющих
небольшое пространство поиска. Перечислю некоторые из практически ценных задач.
- Составление расписаний, например, учебных занятий на факультете, в школе и т.д. (мне за создание такой программы институтское начальство даже приплатило).
- Символьные аналитические вычисления - написать ядро пакета по типу Мэйпла на Прологе реально не составляет никакого труда - по крайней мере, базовые вещи (например, процедура для дифференцирования состоит просто в перечислении правил этого дифференцирования, например, diff(sin(F),X,cos(F)*DF) :- diff(F,X,DF), !.), причём у вычисление численных значений у сгенерированных символьных выражений тоже не требует никаких усилий.
- Естественно-языковые интерфейсы (на Прологе просто перечисляются правила грамматики и словарь, причём в самом естественном виде (семантический разрыв = 0), и при этом они уже являются програмой, готовой к запуску). Кстати, язык можно использовать не только естественный, но и любой формальный, например, эта вещь была бы очень полезна при разработке компиляторов - для создания "быстрого прототипа".
- СУБД произвольного типа для БД малого объёма.
- Про игры и головоломки уже говорилось ранее, сюда можно добавить программы для ведения диалога (например, чат-роботы).
Ну о вещах типа экспертных систем умолчу, поскольку не специалист по ИИ. В принципе, Пролог можно и не знать, и жить спокойно, т.к. все эти вещи можно запрограммировать и "обычным" путём (хотя и с затратой существенно бОльших усилий). Но когда уже его знаешь, становится очевидно, что некоторые задачи предназначены именно для Пролога - при их реализации программа, например, на Си, заняла бы 5 экранов, а на Прологе - 5 строчек. Кроме того, понимание концепции логич.программирования здорово помогает при работе с другими языками. Например, шаблонное метапрограммирование на C++ - это по сути один к одному написание Пролог-программ (правда, ортодоксальные проложники это понимать отказываются: http://progz.ru/forum/viewtopic.php?t=14742).

 
 
 
 
Сообщение04.05.2006, 06:50 
Аватара пользователя
:evil:
Тряхну стариной :)

Как я помню, Пролог задает как должна работать система перебора. Это его сила, но и его слабость. Поскольку новые исследования в этой области не могут быть использованы.

Мне представляется, Пролог -- одна из вех в развитие CS. Но мало кто программирует сегодня на Алголе-60 (а с каким трудом я отыскал описание!) -- хотя я не говорю про его современник Кобол (надо признать, глядя на C#/Java, что в них все-таки больше от Алгола, чем от Фортрана и Кобола. Может потому и жив Кобол -- в отличии от Кроноса -- что нет порожденных им языков-отцеубийц).

Декларативное программирование -- Святой Грааль CS. Это мечта, которая пока, увы, больше в стадии разработки, чем практического применения. Мне трудно представить себе систему бухгалтерского учета, написанную декларативно. А как было бы класно -- ввел закон о налогах, и половина ноши с плеч долой! все сама подсчитает... И сама же сидеть вместе с Ходорковским будет...

 
 
 
 
Сообщение04.05.2006, 12:35 
Аватара пользователя
Цитата:
Мне пришлось с нуля изучать Пролог 5 лет назад, когда меня кинули это дело преподавать.

У меня та же проблема...
Порекомендуйте примерный планчик, что в какой последовательности изучать, какие конкретно наглядные примеры использовать.
Ринулся я тут пузырьковый метод сортировки реализовать на Прологе - думал, думал :roll: , так и пришлось в учебное пособие заглядывать - до конца сам не смог.
Говорят, Пролог максимально приближен к человеческому мышлению, однако со своим мышлением я этой аналогии не просматриваю. :cry:

 
 
 
 
Сообщение07.05.2006, 02:29 
Цитата:
Как я помню, Пролог задает как должна работать система перебора. Это его сила, но и его слабость. Поскольку новые исследования в этой области не могут быть использованы.
Ну почему же - вполне могут. Конечно, сам Пролог основан на поиске в глубину методом backward inference, но остальные методы поиска на нём вполне можно запрограммировать (многие даже достаточно просто)
Цитата:
А как было бы класно -- ввел закон о налогах, и половина ноши с плеч долой! все сама подсчитает
Наверное, когда-нибудь к этому всё придёт, никаких принципиальных препятствия для этого вроде не видно. Ведь написание законов - это тоже программирование (причём в основном как раз логическое. Кстати, создатели всяких теневых схем - это как раз аналоги хакеров-крякеров), и когда-нибудь формализация его постепенно дойдёт до степени возможности автоматизации.
Цитата:
Ринулся я тут пузырьковый метод сортировки реализовать на Прологе - думал, думал , так и пришлось в учебное пособие заглядывать - до конца сам не смог.
Говорят, Пролог максимально приближен к человеческому мышлению, однако со своим мышлением я этой аналогии не просматриваю.
Приближен - оно-то, конечно, так, но в то же время в Прологе имеются всякие методы повышения эффективности программ, в том числе и чисто процедурные по смыслу, применение которых значительно осложняет понимание, особенно если опыт программирования небольшой. Например, до всех нюансов применения отсечения (того, что обозначается воскл.знаком) я дошёл вовсе не на первом году изучения. Не говоря уже о студентах! Поэтому лучше осваивать помаленьку и постепенно. Что касается сортировки, то лучше начинать с медленной ("наивной") сортировки - у неё минимум процедурной семантики, т.е. программа почти чисто описательная. У всех остальных сортировок уже без процедурной семантики (т.е. осознания, что делаем вначале, а что потом, а не просто что истинно, а что ложно) не обойтись - наверное потому, что сортировка - это всё-таки алгоритм, и никуда от этого не деться.
Цитата:
Порекомендуйте примерный планчик, что в какой последовательности изучать, какие конкретно наглядные примеры использовать.
По поводу того, в какой последовательности изучать Пролог - тут, наверное, сколько людей, столько и мнений. Изложу своё. (Иногда заглядываю на прологовский форум http://progz.ru/forum/viewforum.php?f=10, там частенько обсуждаются вопросы его оптимального изучения и преподавания, но все они выглядят для меня какими-то слишком высокими материями. Наверное, для тех, у кого Пролог основной рабочий инструмент, а не дополнительный (как у меня), мир выглядит по-другому). Во-первых, заведите себе книжек (классикой являются Клоксин-Меллиш, Братко, и Стерлинг-Шапиро, все есть в инете): например, http://dstu2204.narod.ru/3sem/lp/bratko.cab, или посмотрите на http://progz.ru/forum/viewtopic.php?t=11193, на lib.org.by тоже кое-что есть. Мне в своё время книжка Братко здорово помогла. Изучение, по-моему, лучше начинать с чисто логических вещей, убрав всё процедурное (ввод-вывод, отсечение, динамическое добавление-удаление предложений и т.п.). Поначалу даже лучше и без рекурсии обойтись. Например, рассмотреть задачку типа построения таблиц истинности формул логики высказываний: на базе логических связок с заданными таблицами
'не'(0,1).
'не'(1,0).
'или'(0,0,0).
'или'(0,1,1).
'или'(1,0,1).
'или'(1,1,1).
и т.п. построить таблицу истинности при помощи заданной формулы, например,
'->'(X,Y,Result) :- 'не'(X,NotX), 'или'(NotX,Y,Result).
или помоделировать задачки из анализа логических схем (типа задаём сигналы на входе и смотрим, что будет на выходе или наоборот). Ещё пример - поиск команд в таблице чемпионата по какому-нибудь критерию (типа запросов на выборку в sql).
2. добавить рекурсию. Типичные задачи: программа "родственные отношения" (есть во всех книжках и в инете), программа поиска пути по карте каких-нибудь транспортных маршрутов или схеме метро (пока без нахождения пути, а просто найти ответ на вопрос: до каких пунктов можно с пересадками добраться из заданного).
3. рассмотреть понятие составного терма ("структуры"). Здесь примеры на символьную арифметику: дифференцирование, упрощение, раскрытие скобок и т.п.
4. Списки. Теперь можно добавлять нахождение пути по карте с занесением этого пути в список. Ну и всякие простые операции со списками: member, конкатенация, обращение, etc. Кстати задача Эйнштейна.
5. Численные расчёты: вычисление факториала, чисел Фибоначчи и т.п.
6. Основы процедурной семантики (программа "большой, тёмный" из книжки Братко), отсечение. Только самые простые и необходимые вещи типа добавления отсечения в вычисление факториала, чтобы не было переполнения стека. По опыту, студенты коммерческого вуза процедурную семантику не понимают даже после 1 семестра изучения (а многие - и вообще никогда), поэтому лучше их этим сильно не грузить - только самое необходимое.
7. Метод решения задач "поиск в пространстве состояний". Программа "обезьяна и банан". На эту тему могу дать учебный пример генератора расписаний занятий.
8. Форматированный вывод, файловый ввод-вывод.
9. Динамическое добавление-удаление предложений программы. "Самообучающийся факториал", динамическая СУБД.
10. Метапредикаты (not, =.. , call, functor, clause, etc.)
11. Предикаты высших порядков (bagof, setof, findall).
Ну по ходу процесса будет видно: возможно, что-то надо копать глубже, а что-то вообще опустить.
Наверное, параллельно надо проходить какие-то теоретические основы (например, минут по 10 в начале каждой лекции). По крайней мере, по-моему, обязательно следующее: логика высказываний - логика предикатов 1 порядка - клаузальная форма логики предикатов - клаузы Хорна, т.к. это лежит в основе логич. программирования.

 
 
 
 
Сообщение07.05.2006, 08:25 
Подскажите, в какой книге подробно описан механизм унификации? У меня была когда то такая книга по прологу, да сплыла. А кто автор - вспомнить не могу.

А еще - посоветуйте фриварный (не "гну"тый) пролог, со свободной лицензией типа zlib'а (да еще, желательно, с обвязкой для питона или с#). Если вообще такой существует, конечно...

(Кстати гнутый пролог последний раз обновлялся в 2000 году, из чего следует что пациент скорее все таки мертв, чем жив ;-) К нему есть обвязка для питона на SWIG, но я как то не фанат ни гну, ни swig...)

 
 
 
 
Сообщение07.05.2006, 11:31 
Аватара пользователя
Позвольте реплику неспециалисту по Прологу.
Вот нашел в своей библиотеке книжку А.Адаменко и А.Кучуков Логическое программирование и Visual Prolog. СПб, 2002. 990 стр. На СД диске дистрибутив Visual Prolog.
Из чего делаю вывод: раз продукт развивается, значит это кому то нужно :)
Сам купил эту книжку в надежде прочитать. Но так до сих пор и не получается :(

 
 
 
 
Сообщение07.05.2006, 18:31 
Igor Borovikov писал(а):
Подскажите, в какой книге подробно описан механизм унификации?

Я лично осваивал по этой: "Чень Ч., Ли Р. Математическая логика и автоматическое доказательство теорем. Наука. 1983". Но в ней используется Лисп. Еще был такой сборник: "Логическое программирование: сборник статей, Агафонов В.Н. (ред.) Мир, 1988".

 
 
 
 
Сообщение07.05.2006, 18:49 
sexstant писал(а):
Позвольте реплику неспециалисту по Прологу... раз продукт развивается, значит это кому то нужно :)

Это не противоречит исходной гипотезе топика об "относительной бесполезности" Пролога.
Другой пример: помнит ли еще кто-либо, кроме "старослужащих", язык Форт? А я вот получил письмо от рекрутера о возможной работе, где требуется "C, C++ & Forth".

 
 
 
 
Сообщение07.05.2006, 20:17 
Yuri Gendelman: Спасибо за ссылки на книги.

 
 
 
 
Сообщение09.05.2006, 00:44 
Цитата:
А еще - посоветуйте фриварный (не "гну"тый) пролог, со свободной
Из "эдинбургских", соответствующих ISO-стандарту, самый популярный сейчас, похоже, swi-prolog (www.swi-prolog.org). Распространяется по GPL. API у него встроен только для C/C++, остальные интерфейсы (в т.ч. и под # и питон) доступны как отдельные пакеты (see doc).
Со многими API знаю ещё Amzi! Prolog+Logic Server (http://amzi.com), но он не freeware (раньше был freeware for personal use, но сейчас, похоже, уже нет). Кстати, его сайт сильно хвастается, в каких крутых областях этот пролог применяется.

 
 
 
 
Сообщение09.05.2006, 04:57 
wowec - спасибо!

 
 
 [ Сообщений: 19 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group