LINUX.ORG.RU
ФорумTalks

[haskell] Нужен ли Пролог?

 


1

3

Я сейчас в качестве хобби изучаю Haskell. Пока только начало, времени особо нет. В универе долбают Прологом. Ради интереса прогуглил.

http://www.haskell.org/haskellwiki/Logic_programming_example

Хаскелль прекрасно умеет логическое программирование?

Вроде бы нормально логическая программа решается на Haskell. Я не особо еще его выучил, даже монады еще не понял зачем нужны.

Вопрос, это очень простой пример и Prolog все-таки нужен? Или Хаскель все так-же умеет, не смотря на то что функциональный? Задача решена, нормально работает на GHC. Дело в том, что в Прологе больше и синтаксических конструкций особо нет, потому заменять из на код Haskell не должно быть сложно.

Сразу предупреждаю что новичек в Haskell и Пролог. Хотелось бы послушать что думают люди, которые нормально разбираются в этих ЯП.

Спасибо

★★★★★

Мля, я написал огромный пост, но меня отвлекли и я его не сохранил.

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

Например, вводишь факты о том кто является мужчиной, кто женщиной, потом, кто чьим отцом, кто чьей матерью. Потом вводишь составное понятие брат = мужык, у которого твой отец тоже отец и твоя мать его мать и этот мужык не ты сам.

brother(X,Y) :- male(X), father(F,X), father(F,Y), % причем нам пофигу кто отец, лишь бы совпадал X<>Y, % не ты сам mother(M,X), mother(M,Y).

после этого описания задаешь вопросы, как к базе данных например: ?father(X, Петя) - вернет тебе всех отцов пети :) ?father(Вася, X), mother(Катя, Х), male(X) - сыновья Кати и Васи.

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

Zubchick
()

Пролог — это не только язык, но и *машина вывода*, которая делает унификацию (unification), всякие откаты (backtracking). Haskell такой машиной не обладает. Ее, наверное, можно реализовать, но факт остается фактом.

http://www.haskell.org/haskellwiki/Logic_programming_example

Хорошие логические программы пишут на Хаскеле, я смотрю :)

main = do
    putStrLn "----------- Hetrosexual Couple -----------"
    mapM_ print (solve_puzzle (/=))
    putStrLn "----------- Gay Couple -----------"
    mapM_ print (solve_puzzle (\x y -> x == y && x == Male))
    putStrLn "----------- Lesbian Couple -----------"
    mapM_ print (solve_puzzle (\x y -> x == y && x == Female))
Zubok ★★★★★
()
Ответ на: комментарий от Zubchick

ля! забыл про форматирование

brother(X,Y) :-
    male(X),
    father(F,X),
    father(F,Y), % причем нам пофигу кто отец, лишь бы совпадал
    X<>Y, % не ты сам
    mother(M,X),
    mother(M,Y).

Zubchick
()
Ответ на: комментарий от Zubok

Но там в конце листинг кода. Если убрать комменты и форматирование, то там кода не особо больше чем в прологе. Да и делает тоже самое и похожим образом как и Prolog машина.

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

vertexua ★★★★★
() автор топика
Ответ на: комментарий от Zubok

И почему FreeBSD не написана на Хаскелле...

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

>Но изучая Хаскелль можно захватить сразу две парадигмы

Вас в детстве случайно не заставляли кататься на велосипеде в ластах, чтоб сразу и на велосипеде ездить, и плавать научились? =)

kranky ★★★★★
()
Ответ на: комментарий от vertexua

И получить кашу в голове?

К тому же все эти прологи на лиспах, лиспы на хаскелях, лиспы на фортах и форты на смоллтолках - это очень мило и все такое, но это наколеночные поделки, игрушки.

dmsh
()
Ответ на: комментарий от vertexua

я понял с помощью guard

Матчинг и «гарды» в ФЯ не идут ни в какое сравнние с прологовским матчингом, он гораздо универсальнее чтоли. В прологе вся программа - один большой гард :)

dmsh
()
Ответ на: комментарий от vertexua

Решение? Решение чего? Что, есть какая-то проблема?

dmsh
()
Ответ на: комментарий от dmsh

Но если нет необходимости в большом гарде. Он нужен только в одной функции. А бороться с Прологом чтобы сделать цикл не очень весело.

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

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

Zubchick
()
Ответ на: комментарий от vertexua

Я сходил по твоей ссылке. Там не те гарды, про которыя я думал, я говорил про гарды в паттернах, а тут какая-то монадная дребедень, которая неизвестно как работает.

Бороться с прологом за цикл нужно не больше чем с любым другим ФЯ.

dmsh
()
Ответ на: комментарий от Zubchick

достаточно лишь описать факты, а машина вывода сама найдет решение

Да неужели? Вот там прямо сама? Фантастика.

dmsh
()
Ответ на: комментарий от jtootf

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

Вот по этому наверно и пролог :D

Zubchick
()
Ответ на: комментарий от dmsh

Разве не стимул осилить монады? ))

vertexua ★★★★★
() автор топика
Ответ на: комментарий от dmsh

>К тому же все эти прологи на лиспах, лиспы на хаскелях, лиспы на фортах и форты на смоллтолках - это очень мило и все такое, но это наколеночные поделки, игрушки.

А Прологи на Си уже не наколеночные? :)

Между прочим, Allegro Prolog (на CL) уже как бы даже коммерческое решение. Он, конечно, не позиционируется, как соответсвующий ISO Prolog, а написан для того, чтобы вещи, которые легко описываются на Прологе, можно было Пролог-like языком. при этом доступна вся инфраструктура Common Lisp. Он даже и идет как add-on, extension. Пролог-машина, соответсвенно, тоже реализована (спасибо Питеру Норвигу). Ага, и компилируется в найтив компилятором Common Lisp.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Ну наверное этот аллегро не написан в стиле «смотрите! пролог на хаскеле всего за 10 строчек. настоящий пролог больше не нужен!1».

То, что есть ненаколеночные гибридные решения я в курсе. Был, например такой poplog... зашел на сайт, оказывается он до сих пор жив «FREE VERSIONS OF POPLOG INCLUDING POP-11, LISP, PROLOG, ML». Последний релиз был 12го августа.

dmsh
()
Ответ на: комментарий от Zubchick

Ага, особенно когда зададут написать на прологе скажем, архиватор :) машина вывода сама найдет решение, да

Harald ★★★★★
()

Учи оба языка. Они ортогональны как по функциональному назначению, так и по влиянию на сознание. Запомни — хаскелист, который на знает пролог — это позор!

Burbaka ★★
()
Ответ на: комментарий от Harald

Почитай нейросети. Там сама найдет, правда не факт что хорошее. А здесь все очень преувеличено, кажется все программирование на Прологе - борьба с ним. Как бы так получше обмануть машину пролога чтобы она сделала что-то полезное. Эдакий костыль cut вообще убивает

vertexua ★★★★★
() автор топика
Ответ на: комментарий от dmsh

какая-то монадная дребедень, которая неизвестно как работает

посредством этой монадной дребедени работают list comprehensions, например

jtootf ★★★★★
()

Прочитал как «haskell - нужен ли проктолог?».

pevzi ★★★★★
()

Я сейчас в качестве хобби изучаю Haskell.

Я тоже сейчас изучаю хаскель.

Хаскелль прекрасно умеет логическое программирование?

Это только начало. Потом должно придти понимание что на любом языке можно писать в любом стиле.

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

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

даже монады еще не понял зачем нужны.

Я тоже не очень понял что такое монады, но имеется традиция по которой каждый изучающий хаскель, должен написать статью в блоге «о том как я понял, что монады это бурито», или «о том как я понял, что монады это не бурито», или «о том как я понял, что монады нельзя сравнивать с бурито». Abstraction, intuition, and the “monad tutorial fallacy”

На самом деле в монадах нет ничего особенного. Это просто «мета тип» причем один из многих. Примерный список такой Functor, Pointed, Comonad, Applicative, Monoid, Category, Alternative, Foldable, Traversable, Monad, MonadFix, MonadPlus, ArrowApply, Arrow, ArrowZero, ArrowPlus, ArrowChoice, ArrowLoop.

За информацией лучше всего обращаться к статье The Typeclassopedia by Brent Yorgey. Также в ней имеется обширный список литературы способный легко взорвать мозг.

sign
()
Ответ на: комментарий от Zloddey

А что, agda ещё никто не упоминал? Воспользуюсь-ка случаем

;)

What language to learn after Haskell?

It looks like a Lisp (Scheme, Clojure), Prolog, or a proof assistant like Coq or Agda are the main langauages being recommended.

sign
()
Ответ на: комментарий от vertexua

> Эдакий костыль cut вообще убивает

Зато этот костыль помогает быстро бегать ;)

sign
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.