LINUX.ORG.RU

Необычный язык программирования


0

0

Существуют ли языки программирования, где возможно что-то типа

2-a=5

и транслятор бы сам корректно посчитал значение переменной "a"?

Интересует именно подобная возможность языка программирования, а не спецпрограмма а-ля mathcad/mathlab решающая уравнения.

такого вполне можно добиться на обычном языке порграммирования под названием prolog

Pi ★★★★★
()

MetaPost коли мне склероз не изменяет

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

>такого вполне можно добиться на обычном языке порграммирования под названием prolog

И как, по-твоему, унификация такого правила в Прологе будет производиться? Что, Пролог будет все числа перебирать натуральные, чтобы удовлетворить равенство? Все-равно же придется писать некую систему символьной алгебры в минимуме, чтобы переменная именно вычислялась! То есть микроматкада или микроматлаба в данном случае не избежать. И лучше это делать на Common Lisp.

Zubok ★★★★★
()

>Интересует именно подобная возможность языка программирования, а не спецпрограмма а-ля mathcad/mathlab решающая уравнения.

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

Zubok ★★★★★
()

Вот тебе пример, который я прямо вот сходу сделал. Особенно думать не
хотел. Все можно сделать по-другому. Ты не описываешь конкретные
 примеры использования этой констуркции, т. е. где она может 
использоваться и при каких обстоятельствах. Вот тебе пример макроса, 
который присывает глобальной переменной значение, посчитанное из 
формул класса "first - переменная = result". После добавления макроса,
он становится неотъемлемой частью языка. Синтаксически ты можешь 
макрос изменить так, что формула прямо в обычно виде будет в него 
вводиться, а переменная будет в момент компиляции макры создаваться по 
этой формуле. Итак, новая конструкция языка 
(define-variable-by-simple-formula <глобальная-переменная> first result)

[46]> (defmacro define-variable-by-simple-formula (var first result)
`(defparameter ,var (- ,first ,result)))
DEFINE-VARIABLE-BY-SIMPLE-FORMULA
[47]> (define-variable-by-simple-formula a 2 5)
A
[48]> (define-variable-by-simple-formula b 10 5)
B
[49]> (define-variable-by-simple-formula c a b)
C
[50]> a
-3
[51]> b
5
[52]> c
-8
[53]> 

Новую top-level форму define-variable-by-simple-formula теперь
можно использовать в программах на Common Lisp.

Zubok ★★★★★
()

>Существуют ли языки программирования, где возможно что-то типа

>2-a=5

Ну а если тебе что-то глобальное нужно. Например, получать значения из широкого класса уравнений прямо в программе, то Maxima -- твой друг и товарищ. Так как Maxima исполняется в среде Lisp и является этим самым лиспом в принципе по своей нутре, то ты можешь напрямую использовать символы Common Lisp из Maxima и, наоборот, символы и выражения (и, соответсвенно, уравнения) Maxima внутри Common Lisp-куска. Пишешь :lisp и дальше фигачишь лисповый код (произвольное число форм). Расписывать не буду дальше. Можешь почитать про это тут:

http://maxima.sourceforge.net/docs/manual/en/maxima_3.html#SEC5

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

> И как, по-твоему, унификация такого правила в Прологе будет производиться? Что, Пролог будет все числа перебирать натуральные, чтобы удовлетворить равенство?

Насколько я помню, именно так и будет. Не понимаю, как можно знать Lisp и не знать о существовании пролога (если я вас правильно понял).

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

>Насколько я помню, именно так и будет. Не понимаю, как можно знать Lisp и не знать о существовании пролога (если я вас правильно понял).

Неправильно помнишь. Демонстрируй!

З.Ы. Я на Прологе несколько лет программировал. По слову "унификация" ты должен был догадаться, что я знаю Пролог.

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

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

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

Да, и вдогонку.

>Насколько я помню, именно так и будет.

Так и будет, если использовать расширения типа clp(r), clp(q,r), clp(fd). Тогда появляются возможности расширенной унификации. А теперь мой пост:

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

И какие противоречия? Без clp Пролог не сможет решить уравнение.

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

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

Пролог стоит какой-нибудь? Давай конкретнее и без приблуд всяких типа constraint solver. Вот прямо вывод Пролога выдавай для этого простого примера pantagon'а. Давай пример клаузы, в теле которой имеется уравнение 2-A=5. И обсудим.

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

Ты чего такой нервный? Из-за того, что Davidov немного подколол тебя c Lisp'ом? Или тебе не нравится само имя david?

AFAIK, такая фича была в Prolog 10.

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

>Ты чего такой нервный?

Совершенно не нервный. Я вполне предметно пообщаться хочу. Дело в том, что Пролог я в последний раз пользовал десять дет назад (реализации SWI Prolog, Turbo Prolog, Amzi! Prolog). И я вполне мог чего-то пропустить.

А фича такая была и в Prolog IV. ЕМНИП, это и был первый пролог с CLP, по-моему. Но насколько я понимаю (а тут вот хорошо бы, чтобы меня поправили), в стандарте языка ISO Prolog этого нет. Это как бы дополнительные модули, которые могут влиять на ход унификации. И в раных реализациях это может быть, может не быть. И солверы эти у каждой реализации разные. А сам чистый Пролог уравнения решатьи не умеет. Его надо учить.

Так что варианты решения вопроса автора есть вплоть до препроцессора для Си. Хорошо, решим пока, что и Пролог можно использовать, но только с расширением. Типа clp(r,q). Тогда можно сделать так http://www.sics.se/sicstus/docs/latest/html/sicstus/Linearity.html#Linearity . Ну и Common Lisp с макрологией или несложной algebra system.

Пентагон, а расскажи, зачем тебе такое понадобилось? :)

Zubok ★★★★★
()

Не совсем такой пример, но в матлабе и некоторых других программах этого добиться можно. И даже для более сложных уравнений :)

soomrack ★★★★
()

Пентагон, ты еще не забывай про 10-ю проблему Гильберта

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

Вообще-то я баловался программированием на прологе лет 15 назад в годы своего студенчества и ученичества. Поэтому тоже многое забылось. Кажется, в те времена еще не было стандарта ISO Prolog. Тогда в книгах наиболее часто использовали Prolog 10, поскольку это была одна из первых эффективных и наиболее популярных реализаций языка (Turbo Prolog - как бы не совсем пролог).

Кстати, для ямахи была версия пролога с лисповым/скобочным синтаксисом (кажется, Micro Prolog), хотя также существовала версия с обычным синтаксисом. Кстати, последняя была разработкой одного из поволжских вузов под руководством некого товарища Григорьева. Там названия команд были русскими :) Вот, в ней та фича c арифметическими операциями тоже была.

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

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

>Там названия команд были русскими :) Вот, в ней та фича c арифметическими операциями тоже была.

Арифметические операции были в прологе всегда:

goal(Z) :- subgoal2(Z,Y),Y is sin(X)*cos(X),subgoal(X).

Фича с уравнениями -- вот это и непонятно. Их даже записать-то не понятно как. Если использовать Constraint Logic Programming, то решение уравнения -- это частный случай наложения ограничения на переменную:

goal(Z) :- subgoal2(Z,X),{2-X=5}.

Уравнения могут быть и более широким классом линейных и нелинейных уравнений. Возможности будут зависеть только от библиотеки. Стандартный же Пролог унифицирует только из множества конкретизированных предикатов, которые у него есть к настоящему моменту и не умеет подбирать значения числовых переменных в уравнениях, чтобы они удовлетворились. А вот в clp и другие подобные библиотеки дают возможность разрешать правила и влиять на поиск с учетом ограничений, заданных некоторым классом уравнений. В одной реализации Пролога я даже видел специальный API, который позволял писать внешние модули для управления процессом унификации. Но говорить об этом, как о свойстве именно языка Пролог не приходится.

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

Конечно, это не является свойством языка, но в принципе близко к его идеологии: задаем "что" решать, а не "как" решать. Вообще, Пролог не очень хорошо подходит для реализации алгоритмов символьной математики, особенно их итеративной и/или вычислительной части. Здесь Лисп будет выглядеть намного лучше. Сила Пролога в несколько других задачах, которые требуют несколько иного подхода (экспертные системы ??).

Помню, что в конце книги "Искуство программирования на языке Пролог" (один из соавторов Шапиро) есть приложение с простейшим решателем уравнений, написанным на Прологе. Книги под рукой нет, и сто лет в нее не заглядывал, поэтому точно не скажу, как там задавались уравнения. Помню еще, что более полная версия того решателя послужила основой для чьей-то докторской (по-нашему кандидатской). Кажется, там запись уравнений была очень близка к принятой программисткой нотации, что достигалось через переопределение операций с помощью прагмы op.

Про Contstraint Logic Programming прежде не слышал.

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