2014 dxdy logo

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

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


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Вопрос по теории о правилах записи математических выражений
Сообщение28.11.2008, 23:03 


25/10/08
55
Прошу прощения и объясняю почему не использую тег math: нижеприведенные выражения записываются как строка символов в Паскале, где используются для записи алгебраических выражений именно такие символы: (), [], {}, *, /, -,+ и цифры и буквы. Программисты (да и в школе/институте) часто пишут выражения именно с такими знаками (особенно на доске когда пишут). Еще раз прошу прощения и надеюсь, что мое объяснение будет понятным.

Подскажите, пожалуйста, как правильно записываются математические выражения? Можно ли вот такое выражение:
a+b-c*d*e*f*k*l*m*n+g
записать вот так:
a+b-(c*d*e*f*k*l*m*n)+g
или так:
a+b-cdef*k*l*m*n+g
или так:
a+b-(c*[d*e]*f*{k*l*m}*n)+g
или так:
a+b-(c*(d*[e*{f*k}*l]*m)*n)+g
Будет ли это критичной ошибкой или можно записать и так и так? Может есть какие-либо строго прописанные правила, законы, утвержденные математиками?
Можно ли про последнее выражение сказать, что оно однозначно неверно записанное? Или последнее выражение корректно и его можно вычислить, в отличие, например, от такого:
a+b-(c*((d)*e)*f*k*l*m*n)+g
Можно ли выражения с параметрами записывать с помощью больших латинских букв? Можно ли в качестве параметров брать русские буквы? Кроме как условно принятых правил, есль ли именно прописанные какие-то правила?

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:10 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
Ни одна из записей не является математической, поскольку нет всеобщей договоренности, что должно означать соединение элементов звездочкой над пробелом между ними.

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:16 


25/10/08
55
Я имела ввиду звездочка - это знак умножения. Мне нужно выяснить, как можно записывать, простите, алгебраическое выражение. Звездочку использую именно потому, что выражение, записанное инфиксным способом, мне на Паскале нужно преобразовать в префиксную запись, а в Паскале умножение - звездочка. Но преподаватель очень придирчивый и если, например, параметр нельзя записывать большой латинской буквой, то на это прямо нужно указать при проверке выражения, которое он вводит.

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:24 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
Тут я Вам не помощник, а в Паскалях только давление в шинах мерить умею...
Тут нужен специалист по языкам программирования.

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:26 
Аватара пользователя


27/11/06
141
Москва
Brukvalub в сообщении #163062 писал(а):
Ни одна из записей не является математической, поскольку нет всеобщей договоренности, что должно означать соединение элементов звездочкой над пробелом между ними.


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

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

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

А вот наиболее неправильная - третья! Поскольку операция умножения в ней обозначается как звездочкой, так и простой конкатенацией переменных. Можно подумать что переменная $cdef$ умножается на $k$

Ну а на счет разных скобок, в принципе, можно их использовать, если они не вызовут недоразумений

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:42 


25/10/08
55
Сомик, мне нужно определить корректно ли так записывать выражение. Т.е. преподаватель, понятное дело, запишет как можно заковыристие, а моя первоначальная задача выяснить можно ли вычислить это выражение или нет. Понятно, что с разным количеством открывающих и закрывающих скобок, выражение даже понять невозможно, не то, что вычислить. Вот и спрашиваю как правильно. Про переменную cdef и k можно согласиться, а можно и нет, ведь нужна черта над ними. Но с другой стороны, если условились опускать знак умножения, то наверно надово всем выражении опускать?
Brukvalub, дело не в языке программирования, а в том, корректна ли запись для того, чтобы ее прочитать и вычислить, а с помощью чего (калькулятор, листочек с ручкой, Паскаль)-дело десятое.

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:45 
Аватара пользователя


27/11/06
141
Москва
Sakura в сообщении #163064 писал(а):
Я имела ввиду звездочка - это знак умножения. Мне нужно выяснить, как можно записывать, простите, алгебраическое выражение. Звездочку использую именно потому, что выражение, записанное инфиксным способом, мне на Паскале нужно преобразовать в префиксную запись, а в Паскале умножение - звездочка. Но преподаватель очень придирчивый и если, например, параметр нельзя записывать большой латинской буквой, то на это прямо нужно указать при проверке выражения, которое он вводит.


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

Если вы сами можете потребовать в каком виде задается входное выражение, то лучше требовать "как можно более точную запись" - каждая операция заключается в скобки, т.е. $((a+(((b*c)*d*)e)) + f)$

А если вы не в праве давать такие ограничения, то надо выяснить кто в праве их давать (преподаватель, например) и зафиксировать грамматику. Если грамматика не фиксирована, то про анализатор просто нет смысла говорить. Можно и $cdef$ использовать, просто это надо аккуратно определить в грамматике.

 Профиль  
                  
 
 
Сообщение28.11.2008, 23:54 


25/10/08
55
Сомик, в том то все и дело, что он может вообще записать и a+b;c_d*f - это его дело, а моя задача на первом этапе проверить, можно ли это выражение вычислить, т.е. можно ввести и неограниченное количество скобок, но выражение можно будет вычислить, просто его запись будет нерациональна, но корректна, как например
a+(((((b-c))))). Т.е. ограничивать преподавателя правилами ввода я не могу. Отсюда и вопрос: есть ли какие-то кем-либо ОПРЕДЕЛЕННЫЕ правила записи и чтения алгебраических выражений?

 Профиль  
                  
 
 
Сообщение29.11.2008, 00:42 
Заблокирован


16/03/06

932
Sakura в сообщении #163078 писал(а):
a+(((((b-c))))). Т.е. ограничивать преподавателя правилами ввода я не могу. Отсюда и вопрос: есть ли какие-то кем-либо ОПРЕДЕЛЕННЫЕ правила записи и чтения алгебраических выражений?

Для какой дисциплины правила нужны? Для статьи по математике?
Для кода программы конкретного языка программирования?

 Профиль  
                  
 
 
Сообщение29.11.2008, 00:53 


25/10/08
55
Для выяснения корректности записи, дисциплина тут ни при чем. Здесь важно выяснить корректно (не значит рационально) ли введено с клавиатуры выражение (если приходится использовать знаки, то для умножения это *, для деления /, для сложения +, для вычитания -, для скобок (, ), {, }, [, ], а все остальные знаки, например, :, ?, ., ., $, % если используются в выражение, то оно уже некорректно), т.е. имеет ли смысл работать с ним дальше (раскрывать скобки, перемножать, складывать, вычитать, делить, выражение вообще может не иметь букв, а иметь только цифры).

 Профиль  
                  
 
 
Сообщение29.11.2008, 00:59 
Аватара пользователя


27/11/06
141
Москва
Sakura в сообщении #163078 писал(а):
Сомик, в том то все и дело, что он может вообще записать и a+b;c_d*f - это его дело, а моя задача на первом этапе проверить, можно ли это выражение вычислить, т.е. можно ввести и неограниченное количество скобок, но выражение можно будет вычислить, просто его запись будет нерациональна, но корректна, как например
a+(((((b-c))))). Т.е. ограничивать преподавателя правилами ввода я не могу. Отсюда и вопрос: есть ли какие-то кем-либо ОПРЕДЕЛЕННЫЕ правила записи и чтения алгебраических выражений?


Еще раз. Правила вы назначаете сами. Другое дело, на сколько они универсальны. Например, если вместо английского $a$ написать русскую букву $\mbox{а}$, то ваша программа должна распознать это как две разных буквы или как одну букву, или вообще выдать ошибку. Я это говорю к тому, что правила могут варьироваться, вы сами должны установить их. Как уже сказано выше "однозначных стандартных математических правил" нет. Все ваши выражения можно расценивать как корректные. И это уже преподаватель (как заказчик программы, в некотором смысле) должен определить эти правила, или вы вместе должны их оговорить.

Я думаю разумно вам настаивать на следующих правилах: умножение записывается как $a*b$, т.е. $ab$ - является отдельной переменной. Скобки использовать только круглые. Думаю это наиболее адекватные правила, тем более, если это просто учебная задача.

Добавлено спустя 3 минуты 20 секунд:

Sakura в сообщении #163092 писал(а):
Для выяснения корректности записи, дисциплина тут ни при чем. Здесь важно выяснить корректно (не значит рационально) ли введено с клавиатуры выражение (если приходится использовать знаки, то для умножения это *, для деления /, для сложения +, для вычитания -, для скобок (, ), {, }, [, ], а все остальные знаки, например, :, ?, ., ., $, % если используются в выражение, то оно уже некорректно), т.е. имеет ли смысл работать с ним дальше (раскрывать скобки, перемножать, складывать, вычитать, делить, выражение вообще может не иметь букв, а иметь только цифры).


Ну вот вы сами сформулировали правила. В чем тогда вопрос то заключается? Любое выражение, которое соответствует этим правилам - корректно, если не соответствует, то некорректно. Только надо аккуратно со скобками определиться, например является корректным такое выражение $([a)]$. Думаю, разумно сказать что нет.

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

 Профиль  
                  
 
 
Сообщение29.11.2008, 01:03 


25/10/08
55
Сомик, он такой, что, если я приму, что умножение - это только * и 10a не имеется ввиду как 10*а, то он обязательно спросит, а на каком это основании ты так делаешь? Я что, не имею права в выражении записать вместо 10*a 10a? Имею. Вот и делай так, как я имею на это право. А вот если он скажет: а на каком основании ты ((()) не считаешь за (), то тут я смело отвечу, что количество открывающих скобок должно быть равно количеству закрывающих, то тут не поспоришь. Вот потому и спрашиваю, корректно ли в обозначениях параметров писать русские буквы (не схожие внешне с латинскими, а именно русские, как то ы,я, ч,б) или использовать две круглые скобки одновременно с одними квадратными и одними фигурными?

 Профиль  
                  
 
 
Сообщение29.11.2008, 01:10 
Аватара пользователя


27/11/06
141
Москва
Sakura в сообщении #163094 писал(а):
Сомик, он такой, что, если я приму, что умножение - это только * и 10a не имеется ввиду как 10*а, то он обязательно спросит, а на каком это основании ты так делаешь? Я что, не имею права в выражении записать вместо 10*a 10a? Имею. Вот и делай так, как я имею на это право. А вот если он скажет: а на каком основании ты ((()) не считаешь за (), то тут я смело отвечу, что количество открывающих скобок должно быть равно количеству закрывающих, то тут не поспоришь. Вот потому и спрашиваю, корректно ли в обозначениях параметров писать русские буквы (не схожие внешне с латинскими, а именно русские, как то ы,я, ч,б) или использовать две круглые скобки одновременно с одними квадратными и одними фигурными?


На счет русских букв, я думаю, это корректно. По крайней мере, у нас в лекциях по алгебре проф. Артамонов писал $\sum\limits_{\mbox{ы} = 1}^{\mbox{щ}}$. Боле того, не думаю, что программа сильно поменяется, если будут учитывать русские буквы.

На счет скобок, думаю, корректно, если они правильно вложены $([a])$, а не $([a)]$

 Профиль  
                  
 
 
Сообщение29.11.2008, 01:12 


25/10/08
55
Сомик, а в какой-нибудь мат. литературе, задачнике встречали такое? Укажите на эту литературу, пожалуйста. Я про скобки имела ввиду такое:
(([{(a)}]))

 Профиль  
                  
 
 
Сообщение29.11.2008, 01:21 
Аватара пользователя


27/11/06
141
Москва
Sakura в сообщении #163097 писал(а):
Сомик, а в какой-нибудь мат. литературе, задачнике встречали такое? Укажите на эту литературу, пожалуйста.


Литературу сейчас сходу не вспомню, но в интернете есть куча информации по лексическим анализаторам.

Например тут. На первый взгляд, вполне внятно.
И еще тут

Добавлено спустя 4 минуты 52 секунды:

Sakura в сообщении #163097 писал(а):
Я про скобки имела ввиду такое:
(([{(a)}]))


По моему мнению и опыту, это корректно.

И еще тут достаточно подробно.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group