Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Сопоставление математическим формулам их названий (http://forum.oszone.net/showthread.php?t=160677)

Ghost 17-12-2009 21:38 1298035

Сопоставление математическим формулам их названий
 
Всем доброго времени суток!

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

Вот что я пока что имею:
Код:

function proverka (s:ShortString): byte;
//функция проверяет правильность ввода функции
//kolvoskobok может быть отрицательным поэтому шотинт
var kolvoskobok:shortint;
i:byte;
begin

//проверяем первый символ
if s[1]='(' then kolvoskobok:=1 else
begin
kolvoskobok:=0;
if ( not (s[1] in ['a'..'z', '!', '0', '1']) ) then begin proverka:=1; exit; end;
end;

//проверяем последний символ
if s[length(s)] in ['&','+','-','~','@','|','/','!','('] then begin proverka:=length(s); exit; end;
proverka:=0;

//проверяем оставшиеся символы
for i:=2 to length(s) do
begin
if s[i]='(' then begin inc(kolvoskobok); if (s[i-1] in ['a'..'z',')','0','1']) then begin proverka:=i; exit; end; end
else if s[i]=')'then begin dec(kolvoskobok); if (s[i-1] in ['&','+','-','~','@','|','/','!','(']) then begin proverka:=i; exit; end; end
else if (s[i] in ['a'..'z','0','1']) then begin if (s[i-1] in ['a'..'z',')','0','1']) then begin proverka:=i; exit; end; end
else if (s[i] in ['&','+','-','~','@','|','/']) then begin if (s[i-1] in ['&','+','-','~','@','|','/','!','(']) then begin proverka:=i; exit; end; end
else if s[i]='!' then begin if (s[i-1] in ['a'..'z',')','!','0','1']) then begin proverka:=i; exit; end; end
else begin proverka:=i; exit; end;
end;

//проверяем количество скобок
if kolvoskobok <> 0 then proverka:=255;
end;

Подскажите, пожалуйста, в каком направлении мне копать дальше?

Ghost 17-12-2009 21:43 1298043

Насколько я понял, мне нужна что-то типа БД с самыми распространёнными мат. формулами, которая бы содержала саму формулу, + её название, а дальше, методом сравнения двух формул, введённой пользователем с теми, что находятся в базе я бы находил нужную...
Как бы это всё реализовать?

lxa85 18-12-2009 06:22 1298235

Ghost, вводи табуляцию! Твой код сложно читать.
Конструкцию
PHP код:

//проверяем первый символ
if s[1]='(' then 
  kolvoskobok
:=else begin
       kolvoskobok
:=0;
       if ( 
not (s[1in ['a'..'z''!''0''1']) ) then begin
              proverka
:=1
              exit; 
        
end// if ( not (s[1] in ...
   
end;// else if s[1]='(' 

я не понимаю.
Мы первым условием смотрим на s[1] зачем проверка на другие символы?
Ладно, если работает, то пусть будет.
А вот это что?
PHP код:

//проверяем последний символ
if s[length(s)] in ['&','+','-','~','@','|','/','!','('then begin proverka:=length(s); exit; end;
proverka:=0

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

Блок
//проверяем оставшиеся символы
переписать с использованием конструкции case of

Где формулировка задачи?
Где возможные варианты написания формул? (Интересно наличие там символов '&',''~','@','|', а умножение кстати где?)
Это отправная точка, из-за чего весь сыр-бор собственно.

ИМХО
можно попробовать получить строение формулы, и сравнить с известными конструкциями.
Как дальше делать по шагам, не скажу :)

pva 18-12-2009 07:36 1298254

1. формулу нужно разобрать в дерво выражений
2. ввести оценочную функцию близости деревьев (наложения скелетов выражений) с параметрами сложности (кол-во ветвей) и похожести (расположение операторов на своих местах)
3. создать базу данных деревьев - названий
4. выбирать из базы максимально сложные, затем максимально похожие

Может возникнуть ситуация, когда формулу невозможно узнать. Вообще как работает разбор (если натолкнёт на идеи) можно посмотреть на мат.пакете Wolfram Reserach Mathematica. Там движок позволяет делать пользовательските замены (assumptions) при упрощении формул (simplify)

lxa85 18-12-2009 08:04 1298261

pva, эх ты! Взял, все рассказал.
Придется отыгрываться на реализации алгоритма. :)

pva 19-12-2009 14:10 1299213

lxa85, это твой студент? Я дико извиняюсь :sorry: Но если он через неделю сможет вслух воспроизвести идею алгоритма и ответить на каверзные вопросы про подбор функции сравнения - ставь зачёт не думая :yes:
А вообще тема очень интересная. Если будет рабочий вариант тестового примера, я помогу довести его до ума. По сути это простейший переводчик иностранных языков. Программа разбирает текст на синтаксические конструкции, а потом ищет их "перевод" в базе данных.

lxa85 19-12-2009 15:53 1299273

pva,
Цитата:

Цитата pva
lxa85, это твой студент? Я дико извиняюсь »

:) Нет, не мой, просто был шанс для маневра :)

Цитата:

Цитата pva
А вообще тема очень интересная. »

По поводу автоматического перевода текста столько трудов написано, что практически на все случаи жизни.
Посмотрим как Ghost "отсреливаться" будет, если что, материал по переводу текстов подкину, тут его скопилось немного :)


Время: 08:22.

Время: 08:22.
© OSzone.net 2001-