Pull to refresh

Comments 123

Можно отсеивать студентов кто на 4 курсе не может перевернуть список на Прологе
Все проще, можно отсеивать студентов, кто не может написать Hello World без синтаксических ошибок.

Можно ли на прологе реализовать четырёхзначную логику?

Можно, только надо объявить все 4 состояния и логические отношения для них.

Имеется ввиду таблицы истинности описать? А как описать выражения типа "если из А следует Б, то из В следует Г"?

А зачем 4 состояния для этого?
(А->Б)->(В->Г), где "->" — это импликация. "А->Б" — это "(не А) или Б".
Разворачиваем:
(А->Б)->(В->Г) =
(не ((не А) или Б)) или ((не В) или Г) =
A и не Б или не В или Г
>_<

4 состояния не для этого.
Вы говорите про материальную импликацию, которая по сути и не импликация вовсе.
Но вопрос был в том, как импликация описывается на прогологе. Про десять типов стрелок в математикие и так всё ясно.

Правильно ли я понял, что импликация на прологе не представима?

Представима:
implication(X) :-
(X = a ->
write('Argument a received.'), nl
; X = b ->
write('Argument b received.'), nl
;
write('Received unknown argument.'), nl
).


В документации есть ещё такое.
Мне кажется, вам лучше прочесть короткое введение в пролог, тогда вопросы отпадут. Вот например годное.

Неужели это такой сложный вопрос, что на него нельзя просто ответить, не посылая в маны? Там нет ничего про стрелки.

Ok. Грубо говоря ":-" уже и есть импликация. Вам парой комментов выше Akon32 уже достаточно понятный пример привёл, если после этого непонятно, то следовательно лучше прочесть краткий мануал, благо там чтения минут на 10.
Плюс ещё есть отдельный оператор для импликации #==>
Вот серьёзно, всё это элементарно и есть в доках, кмк если бы вам и вправду было бы интересно, вы бы уже и сами загуглили и прочитали по ссылкам выше.

Вот, смотрите, я пишу:


is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
part_of( window, house ).

Такой вопрос выдаёт синтаксическую ошибку:


?- is_my( house ) #==> is_my( window ).

Такой выдаёт false:


?- is_my( house ) -> is_my( window ).

Как мне получить true?

:- use_module(library(clpfd)).
И тогда получите:
?- 0 #==> 1.
true.
?- 1 #==> 0.
false.
Ну а is_my( house ) #==> is_my( window ) в принципе не сработает в том виде, как в описали предикаты выше.

Что-то я не улавливаю смысл такой стрелки работающей лишь с константами.
Что не так с моими предикатами?

У вас они всегда False возвращают.
Смотрите:
is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
part_of( window, house ).

Вызываете первый раз is_my (house).
Пролог передаёт значение hause переменной Part, после чего переходит в предикат part_off, видит, что на первом месте для true должно быть Window и возвращает false.
Просто повызывайте свои предикаты с дебагом и сразу увидите все подобные места

К слову, вот такое вот поведение я считаю большим минусом пролога, т.к. подобные ошибки зачастую неочевидны (у вас ещё простой пример, но я видел достаточно большие проекты, где из-за одного пропущенного предиката всегда был непраивльный результат).

Я не нашёл на свише дебага. Всё там правильно с предикатами:


is_my( house ).
is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
part_of( window, house ).
?- is_my( window ). % true

Как спросить пролог "следует ли, что окно моё, из того, что дом мой?".

Проблема пролога фундаментальна. NP != P. И всякие каты, подшаманивания с перестановками условий и прочие пляски с бубном это не решают.

Хотя с другой стороны, может на квантовых компах он и взлетит…
Проблема пролога фундаментальна. NP != P.
Чем докажете?

Квантовые компьютеры не решают NP задачи за полиномиальное время.

Вы ходите по очень горячим углям! Проблема перебора до сих пор не решена.
Тем более заявление:


Квантовые компьютеры не решают NP задачи за полиномиальное время.

Не является прямым доказательством неравенства этих классов, так как высказанное может вызвано ограниченностью современных технологий и алгоритмов.

Квантовые компьютеры могут ускорять задачи, которые можно представить так, чтобы сумма амплитуд по всем "путям вычисления" давала конструктивную интерференцию для правильного ответа. Да, не доказано, что такой класс задач не включает NP. Но специалисты практически не рассчитывают на то, что NP=BQP (Bounded error Quantum Polynomial time). У Скотта Ааронсона есть более-менее популярные статьи на эту тему.

Но квантовые компьютеры — это система, а у любой системы есть ограничения. Вопрос ведь именно в принципиальной эквивалентности.

Не из этой оперы, Пролог, как и все general purpose ЯП — Turing полон.
Я чёта не уверен на счёт Тьюринг полноты. Для Пролога совершенно точно существуют задачи, которые он не может в отличии от машины тьюринга решить за конечно время.
Это фактически общеизвестный факт — prolog — это логика первого порядка и выполнимость над ней Тьюринг полна, существуют прямые имплементации универсальной машины Тьюринга на прологе в swi чуть ли не в стандартных пакетах идет:

www.swi-prolog.org/pack/file_details/turing/prolog/turing.pl?show=src

Стоит отменить, факт настолько известен, что он даже в Википедии идет в графе Тьюринг полнота пролога:
en.wikipedia.org/wiki/Prolog#Turing_completeness

Это сразу отвечает людям, которые несут чушь про NP-полноту.

> Для Пролога совершенно точно существуют задачи, которые он не может в отличии от машины тьюринга решить за конечно время.

Да, это вообще не оттуда — Тьюринг полна говорит о том, может ли язык программирования симулировать универсальную машину Тьюрига — причем тут вообще конечное время и «решить»?

Я уже не говорю, что пролог напрямую прямо синтаксиса оперирует логикой первого порядка, для выводимости из которой справедлива теорема о Геделя о неполноте => откуда следует проблема останова и здесь никаких NP и конечного времени
www.quora.com/Is-there-any-relation-between-halting-problem-and-Godels-incompleteness-theorems

Так что с удовольствием посмотрю на эти «совершенно точно существующие задачи, которые пролог не может в отличии от машины тьюринга решить за конечно время.»
Так что с удовольствием посмотрю на эти «совершенно точно существующие задачи, которые пролог не может в отличии от машины тьюринга решить за конечно время.»

Вы кажется ничего не поняли. Вернее я неудачно сформулировал. Конечно на прологе можно написать интерпритатор машины тьюринга, на которой уже в свою очередь написать что угодно. Но при этом за выполнимостью того что вы напишите на машине тьюринга вы будете следить сами по правилам машины тьюринга. Если же вы ту же самую задачу успешно решённую вами на Тьюринг машине сформулируете как набор правил для Пролога, то запросто можете улететь в бесконечную рекурсию из-за неправильного порядка строк, и в прологе, особенно в не совсем уж тривиальных случаях, правильный порядок или не очевиден, или может вообще не существовать. Например если для того чтобы найти ответ нужно применить сначала правило A, потом Б и потом снова А, и применение не того правила посылает вас в рекурсию, то правильного порядка вообще не существует. Пролог не сможет решить задачу без переформулирования одного из правил.

Таких примеров тьма, если погуглить «Пролог рекурсия».
> Если же вы ту же самую задачу успешно решённую вами на Тьюринг машине сформулируете как набор правил для Пролога, то запросто можете улететь в бесконечную рекурсию из-за неправильного порядка строк

Еще раз: вы описали правилами пролога описание машины Тьюринга. Всё. Ни за чем не нужно больше следить.

Дали описание новой задачи для машины тьюринга, пролог ее выполнит **в точности** как это сделает машина тьюринга. Если машина улетает в рекурсию, то и пролог улетает. Если машине не улета, то пролог не улетает.

Да уж. Явно проблема не в том, что вы не поняли а в том, что вы не хотите понимать. Вы правы, если программировать тьюринг-машину, можно на ней запрограммировать что угодно.


Но очевидно Вы не понимаете в чём разница между тем, что тьюринг-машину программируете вы, и Прорлог программирует за вас, но со всеми задачами программирования справляется.


Поздравляю вас с победой в споре.

Отлично, вместо предметной технической дискуссии о сложности языков программирования и грамотной аргументации — переход на личности.
А я не хочу опускаться до вашего уровня дискуссии. Я просто оставлю это здесь.
https://ru.wikipedia.org/wiki/Декларативное_программирование ->> «Чисто декларативные» компьютерные языки зачастую неполны по Тьюрингу — так как теоретически не всегда возможно порождение исполняемого кода по декларативному описанию. Это иногда приводит к спорам о корректности термина «декларативное программирование» (менее спорным является «декларативное описание решения» или, что то же самое, «декларативное описание задачи»).

Вы же конечно сами понимаете понимаете в чём таком важном, Prolog не является декларативным, раз так блистательно передискутировали меня. Такому умному и несомненно во всём абсолютно правому человеку мне нечего сказать. Наверное и эту статью в Википедии тоже вы писали. :)))

"такому уровню дискуссии" – это какому?


Здесь нет никаких противоречий, это ссылка на обсуждение термина "декларативное программирование".


Пролог не является декларативным языком по целому ряду причин: это определения через операционную семантику – как например фиксированный порядок выполнения правил сверху вниз, и оператор "cut". Вы меняете порядок правил и меняется результат работы.


Такого не происходит в декларативных таких как Datalog, Answer Set Programming, Minizinc или классический SQL.


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


И я не вижу каким образом авторство статьи на Википедии является критерием истинности.

«такому уровню дискуссии» – это какому?

Это к такому, когда человек знает что такое проблема останова, но при этом делает вид, что не понимает взаимосвязи между словами «решить» и «за конечное время».

Давайте я в последний раз попытаюсь пробудить в вас мысль вместо цитирования:
«Существуют такие декларации задач средствами пролога, которые имеют решение, но пролог не может этого решения найти в силу свойственных ему ограничений, которые вы нагуглили для прошлого коммента. И программист используя имеющиеся у него математические знания, в отличии от Пролога, может преобразовать эти задачи в другую форму, которую можно запустить на симулируемой Прологом тьюринг-машине и таки успешно решить. Или даже просто преобразовать в другую форму, в которой пролог её решить сможет».

Вы вроде как делаете вид, что умны. Если и сейчас до вас не допёрло о чём я, см.мой предпоследний коммент. Надеюсь когда-нибудь вы сумеете выйти из этого цикла.
Вы утверждаете, что они существуют — в чем проблема, приведите ясный, понятный и убедительный пример.
Ну убедительный пример я привести не в силах, просто потому что процесс убеждения требует интеллектуального усилия с обоих сторон. Но ясный и понятный запросто:
ints(0).
ints(A) :- ints(B), A is B - 1.
ints(A) :- ints(B), A is B + 2.
?- ints(1).

Ответ очевиден — true. Любой программист может его получить преобразовав формулировки задачи в другие тождественные, но ни при каком порядке строк сам Prolog ответ найти не сможет, потому что чтобы ответ найти нужно проверять условия в меняющемся порядке.

Я даже как-то в растерянности, куда уж проще то? Я же четыремя комментами выше это описал.
> Любой программист может его получить преобразовав формулировки задачи в другие тождественные
Если они тождественные, то ответ не может меняться — иначе они не тождественные.

Вы привели пример программы, которая зацикливается и она не эквивалента другой программе, которая не зацикливается. Это две разные программы, которые решают две разные задачи. Этим двум программам на прологе будут соответствовать две другие машины Тьюринга.

> Ответ очевиден — true.
«очевидно» — это не формальное утверждение. Очевидно, что гипотеза Римана верна — норм доказательство?

Фактически, вы сделали следующее:

написали некорректную программу, а потом сказали, что ее можно исправить — вопрос какое это отношение имеет к дискуссии в выразимости языка Пролог и его Тьюринг полноте?

Я:

Существуют такие декларации задач

Вы:
Вы привели пример программы, которая зацикливается

Если вы не пытаетесть схранить лицо вопреки очевидному, а всерьёз не понимаете разницы, то это плохо.
Цикл замкнулся.

Хотя конечно вы прикидываетесь, судя по тому, что вы делаете вид, что не способны резвернуть "очевидно" в применение двух последовательно записанных перед вами высказываний. Но тогда опускаться на ваш уровень дискуссии нет смысла и подавно.

Но ясный и понятный запросто:
ints(0).
ints(A) :- ints(B), A is B — 1.
ints(A) :- ints(B), A is B + 2.
?- ints(1).
Ответ очевиден — true.

Вы интерпретируете эти выражения иначе, чем пролог-система. Для вас ответ очевиден, потому что вы думаете не на прологе, но компилятор руководствуется правилами пролога, и у него в полном соответствии с этими правилами получается бесконечная рекурсия. Для интерпретатора какого-нибудь JS тоже можно программу с багами написать и думать, что она должна работать.

Проблема не в том что
Для интерпретатора какого-нибудь JS тоже можно программу с багами написать

Проблема в том, что написать на prolog-е программу которая НЕ попадет в рекурсию и будет выполняться за приемлемое время — гораздо более нетривиальная задача, чем написать программу на JS в которой не будет критичных багов.

И связано это в первую очередь именно с «недодекларативностью» prolog-а. Т.к. во времена его создания не смогли избавиться от вот этого-вот
фиксированный порядок выполнения правил сверху вниз, и оператор «cut»

и чтобы оно при этом все-же работало.
Проблема в том, что написать на prolog-е программу которая НЕ попадет в рекурсию и будет выполняться за приемлемое время — гораздо более нетривиальная задача, чем написать программу на JS в которой не будет критичных багов.

Быть может, если знать пролог лучше, задача становится менее нетривиальной? (я не могу ответить на этот вопрос, т.к. очень плохо понимаю пролог).

Выражения я интерпретирую точно так же как Пролог. Просто пролог умеет манипулировать порядком выражений одним строго определённым способом. Получается декларация задачи, которая решение имеет, но не может быть решена Прологом. О чём, собственно и речь.

Смысл в разнице между декларацией задачи и программой.

А можете расшифровать что этот код описывает?


А является целым, если существует предыдущее целое или существует целое на 2 большее? Почему именно на 2?

0 — целое.
А целое если следующее целое.
A целое если число на 2 меньше целое.

Такое определение покрывает все целые числа. На 2, потому что в такой формулировке Prolog не справляется с рекурсией при любом порядке строк.
Чтобы ответить на вопрос про число 1 утвердительно нужно сначала применить первое правило, и выяснить, что 1 целое если и 2 тоже целое. А потом применить второе правило и понять, что 1 целое если целое — 0. Ну или в обратном порядке. Но пролог всегда умеет применять правила только в одном порядке. Если всегда начинать с первого, то начинать с первого и здравствуй бесконечная рекурсия. Если поменять правила местами он перепрыгнет число ноль, и ускачет в другую сторону применяя только правило 2.

То есть он использует поиск в глубину, тогда как тут уместней использовать поиск в ширину.

Да, он делает поиск в глубину, потому что на любую интересных размеров программу для поиска в ширину даже сейчас памяти не напасёшься. А он создавался в 60-ые годы. Нынешние бронтозавры символьной логики, такие как Wolfram Mathematica могут на много более всякое.

С другой стороны поиск в глубину легко уходит в бесконечность. В этом случае необходимо отсечение через доказательство неостановимости по индукции.

А вот тут есть маленький, но страшно важный фокус. Дело в том, что у нормального логического мышления точно те же самые проблемы, что и у пролога. И это обнаружили ещё древние греки. Всякие парадоксы Зенона и парадоксы об Ахилесе и черепахе — они ровно про это.

Человек справляется с этим двумя способами:
1) Наличие понятий, имеющих априорную оценку, в которые может упереться рекурсия. Понятно, что из-за неполноты и неточности таких оценок могут возникать противоречия. И тогда случается «когнитивный диссонанс», разрешающийся через отдельные механизмы.
2) Наличие эвристик.

Вполне возможно, что будущее логического ИИ как раз и лежит в области прололг-подобных систем, снабжённых нейросетевыми эвристиками. Потому что на нейросети строгую логику организовать можно, но очень сложно, и прямое программирование справляется с этой задачей на много лучше, а сложные эвристики уровня АльфаГо наоборот на много лучше удаются нейросетям.
Давным-давно в универе был курс Пролога. Сначала трудно перестроиться из императивного на мышление предикатами. Потом начинает получаться и кажется, что у тебя новый супермощный инструмент, почти волшебный по сравнению с императивными языками. Правда, дальше лабораторных работ дело не пошло.
В институте был курс Пролога, очень понравилось, хотелось ещё, но куда применить не придумал.

Отличная статья. Пролог действительно интересен. Как кто то уже выше писал — проблема в том что не все типы запросов можно выполнить за разумное время. Вероятно с ростом мощности желена и новыми алгоритмами мы получим большие возможности для декларативных языков в том числе и Prolog — ведь один уже смог взойти на пьедестал, это SQL.)
p.s.
Сам буквально недавно думал над возможностью применить систему работающую с Datalog, искал решения.

SQL взошел на пьедестал в силу своей предметной специфичности (реляционные БД), в которых он, по сути, монополист. Поэтому с Прологом у них изначально разные весовые категории:)
Весовые категории разные, но Prolog несколько десятилетий вдохновлял разработчиков SQL.
У меня о прологе (двадцатилетней или тридцатилетней давности — расцвет его) осталось одно впечатление — язык, способный бесконечно выполняться и занимать бесконечную память на программе размером в десяток строк, и поэтому неприменимый для задач сложнее поиска магических чисел.

Это ведь не совсем Prolog, просто подход похожий (логическое программирование):


After lowering to logical predicates, Chalk then deploys a logical solver to find the answer to the original query; this solver is similar to a Prolog engine, though different in its particular

(отсюда)


Так можно и python фортраном назвать.

Статья интересная в первую очередь постановкой вопроса. Ведь от вопроса «Слышали о языке Prolog?» один шаг до вопроса «Слышали о логическом программировании?», а дальше пара шагов до вопросов «Слышали о математической логике?» и «Слышали о реляционной теории?». На мой взгляд даже небольшой опыт работы с Prolog или Datalog сильно облегчает жизнь при работе с большинством мейнстримовых языков/фреймворков для работы с запросами к данным — SQL, LINQ, JPQL, GraphQL, да даже всяческие stream в Java и прочие *QL. Я уже не говорю о том, что работа с логическим выводом, цепочками рассуждений, продукционными системами многими вообще забыта. Помню, что в институте частенько слышал утверждение, что «Prolog — язык искусственного интеллекта», а в этом году слышал от членов жюри одного известного конкурса на гранты что «Если у вас нет нейросетей, а всего лишь какой-то набор формул (система продукционных правил), то о каком искусственном интеллекте вы говорите, ха-ха»
«Prolog — язык искусственного интеллекта» — это было уже очень старо даже тогда, когда я его в институте проходил в начале 90-х.

Собственно это скорее 70-х готов всплеск интереса к ИИ и породил пролог (он не много не мало мой ровесник :)
Но там же был и Lisp. Кстати простейший интерпритатор пролога на Lisp пишется в десяток строк.

Prolog — язык "искусственного интеллекта" 1980х. Как и лисп — немногим ранее. Но тогда точно не взлетело. А надежды были.
А нейросети, — наверно, — "искусственный интеллект" 2010х. И, насколько я могу судить, этот подход (на данный момент) более успешен, чем пролог.

Нейронки и Пролог — это разные подходы к созданию ИИ. Задача то так стоит. Разные не значит взаимоисключающие. Нейронки — восходящая парадигма — моделирование
интеллектуального поведения на основе биологических элементов. Пролог — нисходящая парадигма — символьные вычисления имитирующие высокоуровневые психические процессы: мышление, рассуждение, речь, эмоции, творчество и т. д.
Подходы к пониманию проблемы

Согласен — не взаимоисключющие. Мне кажется сильный ИИ как раз и будет строится на умелом сочетании символьного вычисления и нейронных сетей.

Мне кажется сильный ИИ как раз и будет строится на умелом сочетании символьного вычисления и нейронных сетей.

Может, но не факт. Пролог сейчас где-то на свалке истории. Скорее всплывёт что-то третье, чем старый никому сейчас не нужный пролог.
Но опять же, использование нейронных сетей сейчас — всегда соединение обучаемых частей (нейронок) и рукотворных алгоритмов.

Пролог например был использован в IBM Watson совместно с нейронками. Хорошая такая свалка истории…

Он как раз на роли ваших «рукотворных алгоритмов» и используется.
Старое — не значит плохое. Я привел пример, чтобы подчеркнуть тенденцию к тому, что в массовом сознании возникает эквивалентность понятий ИИ и нейросетей. Конечно, с увеличением мощностей и количества данных нейросети получили колоссальное развитие. Однако, не располагаю информацией о больших успехах нейросетей в областях, в которых требуется обоснованный вывод или приведение цепочки рассуждений, приведших к результату.
Ну вроде как Watson что-то подобное может… но кстати в нем не только нейронные сети там отделенные компоненты и на прологе есть.
Я учил его пару уроков в универе и все что я понял — в этом языке нет логики, и программировать на нем могут только шизофреники и женщины. Препод который нам его преподавала (женщина), это подтвердила…

Вы целенаправленно движитесь к ачивке "тролль"? :)

кто-нибудь знает как он соотносится с солверами, minizinc и прочим таким?
А вы могли бы какой-нибудь неплохой солвер уловно на «поиграться» порекомендовать (в идеале хочу, чтобы в моём арсенале был инструмент «по-быстрому решить какую-нибудь задачку с ограничениями, при этом достаточно современный).

ПС
По вашему вопросу: я вполне понимаю почему я не хочу пролог — они зафиксировали порядок перебора (ну типа чтобы сделать ЯП „взрослым“ — детерминированно работающим в разных реализациях).
Только в этом и проблема — в случае NP задач надо настолько глубоко вдаваться во внутренние детали работы пролога, что проще то же самое на условном С \ Java написать чем „оптимизировать“ пролог.
У меня именно что «глаза разбегаются» всё подряд пробовать.

Если рекомендуете — спасибо, посмотрю.

Не то что рекомендую, сам не особо разбираюсь, просто они вроде самые популярные, особенно z3.

В качестве видеоряда, сопровождающего лекцию, наверное можно, но сами по себе эти 400+ слайдов — малоинформативное начало IMHO.
мы используем OR Tools от Google, но их много разных по устройству и области применения
Да, скорее он соотносится с Answer Set Programming. Пролог — это general purpose programming language, а минизинк специфичен для комбинаторных задач и задач комбинаторной оптимизации.
У пролога есть подмножество — Datalog, вот он более-менее активно применяется, как язык запросов к графовым СУБД.

Почти любой программист использует одну специфическую версию Пролога с изменённым синтаксисом: она называется make. Похоже, это единственный случай, когда Пролог пошёл в массы.


Prolog применён в Gerrit для управления требованиями по заданию оценок и выставлению требований к допуску ревью. Я его там настраивал и, по-моему, лучше бы они взяли что угодно другое: хоть Фокал или Javascript, хоть Scheme или Haskell… Дело даже не в том, что 99% админов не знают язык — я вроде знаю, но я чуть не поседел, пытаясь понять, по какому принципу он на каком этапе останавливает преобразование выражения, и от какой фазы какого небесного тела зависит, где остановится свёртка.

UFO just landed and posted this here
я вроде знаю, но я чуть не поседел, пытаясь понять, по какому принципу он на каком этапе останавливает преобразование выражения, и от какой фазы какого небесного тела зависит, где остановится свёртка.

ИИ (методы) не может быть прямолинейным.

сейчас вспоминаю со смехом конечно, но когда я начал свой самостоятельный путь изучения программирования, то купил книгу по prolog и попытался понять для чего это надо )) сейчас понимаю как я мог бы это использовать на одном из текущих проектов (автоматическое составление юридических документов), но сразу подумал о производительности и поддержке… и понял что со временем стал думать в сторону "кто будет работать с этим проектом после меня" в большей степени чем "как мне удобнее это написать"… вот тут наверное причина того что на некоторых языках мало пишут, хоть у них и хорошие казалось бы перспективы

Курсач в студенчестве делал — реализацию Prolog на Delphi.
Книжку толстую крутую давали по нюансам реализаций пролога, название не вспомню.
Тема неплохо зашла, ханойские башни и прочие примерчики решались, компилировалось в «шитый» x86-код, вот только реализацию GC не осилил (курсач и так приняли), прога работала до переполнения кучи.
Мечталось ещё реализовать кроме бинарной логики предикатов {0, 1} ещё и «вероятностную» (0..1) и соответствующе допилить механизм логического вывода, было бы что-то вроде Fuzzy Logic Prolog :-)
То же делал реализацию Пролог`а на Delphi, у меня диплом был. Работал даже шустрее чем Turbo Prolog.
У меня в университете был курс по Prolog, действительно позволяет встряхнуть мозг и по-другому посмотреть на разработку. На протяжении всего курса я решил на нем довольно большое количество задач и даже написал экспертную систему в качестве курсовой. Однако за эти 5 месяцев плотной работы с прологом я так и не понял как эта штука устроена. В императивных языках я понимаю, что на условный массив выделяется последовательная память и указатель, а все операции с массивом — это работа с этой памятью и указателем, который я могу передвигать. Я могу прогнозировать асимптотику и ошибки, понимать где слабые места и что можно оптимизировать. В случае с прологом я не понимаю вообще ничего, задачи решаются, но как — ответить я не могу. Порог вход в понимание этого языка в разы больше, а бизнесу надо решать задачи сейчас, а лучше вчера. Мне кажется, именно по этой причине он не вошел в массы, хоть раньше и считался серебряной пулей для разработки ПО.

Однако я слышал, что вроде бы в EPAM-е есть какие-то проекты, где используется какая-то технология, похожая на пролог. Возможно, он немного эволюционировал и занял очень маленькую нишу. Для некоторых задач он действительно хорош.
Ответ на вопрос «как?» на самом деле очень простой: «полным перебором всех возможных состояний решений». Но поскольку совем полный перебор занял бы слишком большое время, то начинаются пляски с бубном…
На пролог рассказывали после LISP-а и голову ломать как оно там внутре нам уже не приходилось бо пролог часто под собой lisp использует. Где-то даже нам показывали транслятор пролога на Lisp-е написанный — там буквально десяток строк текста.
Пролог-код достаточно просто переписать в C# .NET используя yield оператор, по сути каждый предикат будет обозначать цикл.
Да и сам оператор yield показывают всю суть lazy вычислений, так сказать наследие Пролога.
Делал курсовую в универе — экспертную систему на Prolog для прогнозирования цен на нефть. Очень интересный язык, заставивший мозг напрячься и перестроиться с привычного паскаля. К сожалению, за пределами универа больше с ним не сталкивался.
Писал на swi prolog кучу всего: начиная с веб-сайта для друга, которому нужен был сайт-визитка, а у меня была куча свободного времени в универе или скрипты на swi-prolog на отдельном сервере для демонстраций, что swi-prolog вполне себе подходит для этого, заканчивая большими нейронными сетями, которые пишутся гораздо быстрее чем на питоне, хотя сейчас уже не так — слишком много уже сделали в среде питона.
LISP это заготовка из которой пролог делается. Пролог все-таки более высокого уровня абстракциями оперирует.
UFO just landed and posted this here
В студенческие годы нужно было сдавать экзамен с решением задачек на Prolog, а логику того, как оно работает понять не особо получалось… Спасло ситуацию то, что у предлагаемой IDE интерфейс уж очень напоминал компоненты Delphi, которой тогда увлекался — за ночь набросал похожее окно с парой работающих кнопок, парсингом введённых условий и решением задач на «логичной» логике для всех билетов.
Успеваемость студентов по Prolog в том семестре была рекордной :)
А чем Пролог отличается от Лиспа и Scheme?
Они функциональные же. Разве это не другая парадигма?

Пролог используется в банковских системах некоторых для оценки рисков. У нас даже менеджеры для него правила писали. Но конечно мозг ломает.

Из 2020 в будущее:
Большие данные храним и обрабатываем. С нейронками разобрались. Но! Символьные вычисления осваивают единицы. Реализация нисходящей парадигмы реализации ИИ под угрозой.
Подходы к пониманию проблемы
Пролог помог?
Для меня это самый лучший язык. Много на нем писал все что можно. Отлично подходит для всего, почему-то все упирают на то что он для каких-то логических задач. Ну да на нем легко решать задачки про Волка-Козу-Капусту, но писать сайты то же очень даже не плохо.
А опердень можно?
И опердень можно. Когда в банке работал, баловался с оперднями.

Либретто статьи:


бубубу пролог незаслуженно забыт
бубубу
"hello world"
бубубу
примеры продакшена — ссылка раз, ссылка два, ссылка три — "как видите, он много где используется"
бубубу
ИТОГИ: пролог — мощная вещь, а вы пользуетесь прологом?


Имхо, это вода и студенческий реферат по философии.

Пролог язык декларативный, на нем очень легко создавать
— DSL (domain specific languages) — очень удобно создавать свои операторы и вкладывать смысл.
— Парсеры (причем не только КС-грамматик, но и контекстно зависимые)
— Универсальный Решатель задачи и доказательство теорем. [Правда теоремы должны выражаться в предикатах-Хорна, иначе задача не-разрешима за P — Проблема P != NP].
— Описывать функторы и операторы: достаточно просто и изящно можно описывать все функции сортировок,
— Автоматическое доказательство и проверка истинности кода (Используется математический аппарат доказательства теорем).

Prolog не императивный язык! Он требует от каждой операции «возвратности»:
— Нельзя сказать прочитай из памяти и запиши в файл (безвозвратно)
— Проитерируйся по списку и на каждой итерации запиши в базу данных рандомное число
— Вызови REST-API 50 раз и замеряй время выполнения

Конечно, условно можно, но выглядит ужасно (с отсечениями) и ломает всю декларативность. Большинство прикладных задач на практике оказываются императивными, остальное все загоняется в конфиги и sql (декларативная часть) и сшивается снова императивными языками. Поэтому императивный язык — универсален и он побеждает, но наследие идей и красота кода несомненно будут еще долго вдохновлять на различные Domain Specific Languages.

Что значит "условно можно", если предикаты редактирования базы фактов — прямо в стандартной библиотеке на видном месте?
Да, это ломает декларативность и чистоту. (Ну так и на сях, напротив, можно чистые функции писать).


Пролог — довольно тупенький в плане интерпретации предикатов.
Предикат записывается в виде дизъюнкции конъюнкций, которая в общем случае должна одинаково работать для любого исходного состояния — какие аргументы свободные, какие связанные (что нам дано и что надо найти). Мы просто бежим вглубь и откатываемся, бежим и откатываемся.
Проблема в том, что для разных "дано/найти" стратегии забега могут и зачастую должны отличаться.
Тут-то вся декларативность и полетит к чертям.
Единственное отличие от си, в таком случае, — что в си бывают goto-макароны, а в основном код выполняется последовательно; а в прологе код выполняется челночно.


Если хочется декларативности — это надо сформулировать задачу для солвера, а дальше пусть у него голова болит, как строить план вычислений.
Но это уже мета-язык, DSL над прологом.

Я бы ещё добавил, что на прологе удобно пишутся всякие основанные на правилах переводчики. При должном наборе словарей можно даже выдавать терпимые переводы.
Странно, что вообще не упомянут Erlang
Erlang совсем не декларативный, хотя Джо вдохновился Прологом при создании Эрланг, от Пролога там патернматчинг и синтаксис.
Всего-то синтаксис!?! :)

Понятно, что языки принципиально разные. Но не вызывает ли (какого-нибудь… эээ… как бы это назвать…) удивления (может быть?), что такие разные языки, как весь такой декларативный и логический Prolog и совсем такой недекларативный, недофункциональный, а с акторами еще объектный Erlang внезапно имеют между собой нечто общее? Да синтаксис — и не так уж мало для такой огромной и принципиальной разницы. Не ломает шаблон? Не ставит, например, под сомнение «общепринятое» понятие «декларативности»?
Синтаксис он взял из вполне конкретной реализации пролога, Эдинбурский диалект. При чем тут "«общепринятое» понятие «декларативности»" вообще не понял, почему синтаксис какого-то языка должен ставить что-то под сомнение?
Да все ведь просто!

Во-первых, я намекал что далеко не все согласны с тем, что «Erlang совсем не декларативный». Например, в русской Wikipedia про Erlang почему-то прямо так русским по белому и пишут: «декларативный язык программирования». Впрочем, английская тоже поместила его в категорию декларативных.

Тем не менее, я как раз соглашусь — вопрос о декларативности Erlang-а очень спорный. Но просто потому, что трактовка термина «декларативный» довольно смутная.

И родство синтаксиса (практически бесспорно) «декларативного» Prolog и (якобы) «недекларативного» Erlang здесь только подливает масла в огонь. Просто потому, что синтаксис языка с потолка не берется — он, как ни крути, должен соответствовать тому, какие идеи в этот язык заложены. …В общем, удалил я дальнейшее развитие мысли о странностях противопоставления декларативности и императивности и соответствующего деления языков — не место тут разворачивать дискуссию по данной теме.

…Тем более, что я изначально всего-то лишь хотел обратить внимание, что Prolog в свое время стал источником идей и вдохновения не только в области «чистого» логического программирования. И это можно (а, возможно, и нужно) было отразить в статье. Вдруг кто-нибудь нашел бы это достаточным поводом, чтобы задуматься.

Тем более, что связь между Prolog и Erlang гораздо глубже, чем «просто взяли синтаксис». Не интересно разве, почему это для языка, который был предназначен для создания распределенных систем реального времени вдруг взяли синтаксис медленного и узкоспециализированного логического языка? и почему вдруг erlang-исты заявляют, что «Erlang started life as a modified prolog»? — то есть, не «просто взяли синтаксис», а взяли язык и доработали под другую проблематику! Более того, первый компилятор Erlang был написан именно на Prolog-е.

Вообще, ставить под сомнение бывает полезно. Но нужно ли оно лично вам? Каждый решает сам :)
Мало ли чего на заборах пишут. В Prolog есть логическая машина вывода, в Erlang этого и близко нет. Prolog не медленный, не соглашусь, я на нем много писал, если сайтик делать, он не медленнее будет работать чем на том же PHP.
Мало ли чего на заборах пишут. В Prolog есть логическая машина вывода, в Erlang этого и близко нет. Prolog не медленный.
Ой, прошу прощения! Я не сразу понял, что разговариваю с носителем Абсолютного и Окончательного Правильного Мнения, а ключевой вопрос у нас — наличие машины вывода… :) Все, больше вопросов не имею.

Так вот на каком языке Deep Thought считал ответ на "Главный вопрос жизни, вселенной и всего такого"!

Свои пять копеек:
В лохматом 90 году мной был написан проект АСУТП( управление хим производством на ткацкой фабрике ). Проект был написан на borland turboprolog. Некоторые низкоуровненые куски были написаны на borland turboassembler. Проект был принят, оплачен, и использовался — года 3 точно, потом уже не знаю…

доп:
Автору — а еще есть такой язык SmallTalk. Напишите пожалуйста что нибудь о нем. Очень хороший язык. Делал на нем проект в лохматом 1992-1993 гг. Статистический анализ.

Спасибо.
Во-первых, Smalltalk. Во-вторых, про него не часто, но время от времени пишут: поиск в руки ;)

А в-третьих, смолток реинкарнировался в руби :)

Тогда уж он «реинкарнировался» не только в Ruby, но и в Java, и в Objective C, и даже в C# и еще много во что… Но нет! Чтобы «реинкарнироваться», надо умереть. А Smalltalk пока не собирается. Только не надо по этому поводу разводить здесь флейм ;)

Изучал в универе, даже собирался внедрить на работе в качестве движка расчета скидок, т.к. они регулируются похожими запутанными правилами.


Но у пролога есть большая проблема — по исходному коду крайне сложно сказать, как именно он будет работать. Из чего следует три проблемы побольше:


  • как доработать программу на прологе, чтобы не сломать существующий функционал?
  • как обеспечить конечное и разумное время выполнения программы на прологе?
  • если программа выдала неверный результат, как найти ошибку?

Вопрос к экспертам Prolog, вдохновлённый примером про magicNumber: какая будет асимптотичекая сложность решения у обобщённой задачи 2-sum?


magicNumber(A[1]).
magicNumber(A[2]).
...
magicNumber(A[N]).
?- magicNumber(X), magicNumber(Y), plus(X, Y, target)

Такой же вопрос про 3-sum, 4-sum?

Да обычный перебор, без всякого мозга.
Думаю, будущее логического программирования — в составе распространённых универсальных языков программирования, а не в выделенном для этого Прологе. На заре программирования было модно создавать новый ЯП на каждую новую хотелку и идею, но сейчас больше принято внедрять интересные идеи из других языков в существующие, как было с функциональным программированием, асинхронным, примеров хватает. Основная причина в том, что каждый язык обрастает огромной инфраструктурой для решения прикладных задач, и терять её при разработке нового языка очень недальновидно и сильно затрудняет миграцию.
Может быть кому-то интересно: я писал статью о Прологе, цель – как можно проще и понятней объяснить суть и основы языка, с примерами решения задач. Диалект «Пролог-Д», но сути это не меняет. Статья
Sign up to leave a comment.