2009-12-19 4 views
45

Какие проблемы лучше решить в Prolog, чем в Haskell? Каковы основные различия между этими двумя языками?Сравнение Haskell против Prolog


Редактировать

Есть библиотека Haskell (тип логического решателя), которые могут имитировать функциональность Prolog?

+2

Этот вопрос хороший сам по себе. Если есть какой-то способ передать ответ gknauth на новый вопрос, вы должны спросить его снова, чтобы у обоих были свои высококачественные ответы. –

+1

Посмотрите на реализацию языка Curry KiCS2 - диалект Haskell, который поддерживает логическое программирование с нуля. http://www-ps.informatik.uni-kiel.de/kics2/ & https://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/ –

ответ

27

Пролог - это в основном язык, ориентированный на логические проблемы, особенно из AI и лингвистических полей. Haskell - это скорее язык общего назначения.

Пролог является декларативным (логическим) языком, что облегчает формулирование в нем логических проблем. Haskell является функциональным языком и, следовательно, гораздо лучше подходит для вычислительных задач.

Википедия декларативного программирования:

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

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

Википедия по функциональному программированию:

В информатике, функциональное программирование это парадигма программирования, которая рассматривает вычисление как оценки математических функций и избегает состояний и изменяемых данных. В нем подчеркивается применение функций , в отличие от стиля обязательного программирования , который подчеркивает изменения состояния. Функциональное программирование имеет свои корни в исчислении лямбда, формальная система , разработанная в 1930-х годах до , исследует определение функции, назначение функции и рекурсию. Многие функциональные языки программирования можно рассматривать как украшения для исчисления лямбда .

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


Что касается вопроса ДОБАВЛЕННОГО: никто, что я знаю, но вы можете либо translate Haskell в Пролог или implement Пролог в Haskell :)

+52

Этот ответ немного вводит в заблуждение. Логическое программирование (Prolog) и функциональное программирование (Haskell) - это * оба декларативных языка программирования, но они представляют собой различные подходы к декларативной парадигме. – nedned

+3

Haskell, скорее всего, переведен в Prolog, если система Prolog поддерживает приостановленные цели. С приостановленными целями мы можем моделировать ленивую оценку. Но перевод будет тире стираемой программы, поскольку у Prolog нет типов. –

+3

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

26

Пролога является логического программирования языка, в то время как Haskell является a функциональный язык. Функциональные языки основаны на концепции функции , которая принимает несколько аргументов и вычисляет значение.

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

Полезность функционального и логического программирования часто перекрывается. Функциональное программирование в последнее время приобрело немало тяготения, в то время как Prolog по-прежнему является очень нишевым языком, во многом из-за того, что он намного отличается от общих концепций функций и методов основного ООП, чем функциональное программирование, и часто рассматривается (очень) трудноучиться.

Некоторые проблемы становятся почти тривиальными для реализации в Prolog, особенно в сочетании с constraint solvers.

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

+1

Благодарим вас за ценный ответ. Жаль, что можно выбрать только один лучший ответ. – danatel

+0

Определенно приходится соглашаться на то, что Пролог трудно учиться. Я использовал его в двух курсах: AI для создания экспертной системы, а также для решения проблемы кувшина. В концепциях языка программирования мы использовали Prolog для выполнения числовых задач, структур данных, поэтому было аккуратно видеть обе стороны языка. В языках программирования мы использовали диалект Prolog под названием FP, который был написан инструктором в Prolog. Он ввел функциональные элементы в пролог, позволяя автомобилю, cdr, cons, tail/rest и т. Д. Мы также узнали, как реализовать наши собственные поисковые системы отслеживания назад в императивных языках. – Tanner

+0

@Tanner. В основном трудно узнать, потому что, по моему опыту, большинство людей делают естественно, не думать в логических деревьях, а в системах, которые в большей степени соответствуют программированию OO. Например, признание стула как концепции является естественным. Вам не нужно определять каждый отдельный стул, чтобы распознать его как таковой.В Prolog решение логических задач на основе дерева очень легко реализовать по сравнению с OO, но создание систем с входами и выходами, которые изменяют состояние или возвращают один предсказуемый результат, упрощаются на языках OO. –

34

Что касается вопроса о логической библиотеке: если он не существует, его можно создать одним из множества способов. Рассмотренный Schemer строит логические возможности рассуждений в Схеме. В главах 33-34 от PLAI обсуждается Пролог и реализуется Пролог. Эти авторы строят мосты между Scheme и Prolog. Создатели PLT Scheme построили один из своих языков Lazy Scheme после ленивой оценки функции Haskell. Бумага Оксана Киселева LogicT блестящая, как обычно - он толкает границу за то, что возможно на многих языках. Существует также logic programming example на Haskell Wiki.

+1

Спасибо за ваш ценный ответ. Жаль, что можно выбрать только один лучший ответ. – danatel

+1

'LogicT', кажется, путь, с удовольствием побалует себя этой бумагой. – Profpatsch

-9

В действительности есть только 2 языка:

  1. Язык машины
  2. Язык человека.

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

Настоящая работа программиста - думать в обоих направлениях. Некоторые инструменты программирования, такие как ассемблер, заставляют программиста тратить гораздо больше времени на мышление, подобное машине.Другие инструменты, такие как Prolog, позволяют нам больше времени думать, как человек.

Существует штраф, выплачиваемый с каждой крайности либо по эффективности, либо по стоимости.

Если бизнес-логика вашего приложения может быть сведена к набору правил и их выходным целям (например, написанию игры в шахматы), то Prolog идеален. С другой стороны, если вам нужно взять вход и сказать компьютеру, как вычислить вывод, то более подходящим является функциональный язык.

+5

Если вы много использовали Prolog, вы знаете, что большую часть своего времени вы проводите мышление, как машина с ограничением по сокращению отступа, а не человек. :) Люди вообще не думают, как Пролог, хотя, возможно, больше, чем машина Тьюринга. –

+2

Возможно, я должен вернуться с учетом ограничений потока :) Вы абсолютно прав о машине Тьюринга. Я использовал и продолжаю использовать Prolog. На самом деле у меня все еще есть копия Turbo Prolog на 5.1/4-дюймовые двухсторонние плоские дискеты с двойной плотностью в нетронутом состоянии. Возможно, я должен отнести его к парню комиксов. –

+0

Я не удивлен, что это получилось -9 – PascalVKooten

10

Возможно, вы нашли бумагу Escape from Zurg: An Exercise in Logic Programming интересной прочитанной. Он показывает параллельное сравнение реализации простой задачи поиска в Prolog и Haskell, а также небольшую схему типов для представления проблем поиска в более общем плане. Вывод, к которому приходят авторы, заключается в том, что выражение по крайней мере некоторых из этих типов проблем в Haskell проще, чем в Prolog, прежде всего потому, что система типа Haskell облегчает создание хороших представлений состояний поиска и перемещений из состояния в состояние ,

+2

Я думаю, что мы могли бы опровергнуть статью разными способами: Типы не , необходимые для программирования более высокого порядка (я не вижу никаких типов в вызове/n), совпадение шаблонов Haskell и структура здание может быть медленным по сравнению с Prolog (еще не проверял ), проблема может заключаться в использовании CLP (<= 60) (I не вижу, что Haskell предлагает что-нибудь здесь) и т. д. –

+5

Упомянутая статья содержит программы Prolog, написанные программистами, не привыкшими к языку Prolog. Пример: Используется 1, 'trans/4':' append/3'. Программист Prolog помещает список в голову, делая его постоянной, а не линейной для каждого ответа. – false

+1

[native prolog] (https://www.metalevel.at/zurg/). – false