* Словесный калькулятор. * Пример демонстрирует способ распознавания и интерпретации предложений на естественном языке. * Может выполнять арифметические действия (сложение, вычитание, умножение, деление) * с двумя целыми положительными числами от нуля до девятьсот девяносто девяти. * Примеры запросов: "Сколько будет сто двадцать пять вычесть тридцать один?", * "помножь три на пятнадцать", "сложи семь и семьдесят пять" * Программа КОНЦЕПТ, 09.05.2011, www.gendoc.ru присвоить ОБЛАСТЬ_КАТЕГОРИИ 1 ОБЛАСТЬ_ГИПОТЕЗЫ 2 Инициализация_грамматики * Ввод предложения ввести переменная ПРЕДЛОЖЕНИЕ 'Введите фразу (можно свою):' (список сцепить $результат 'Семнадцать прибавить двадцать пять' \ "Сколько будет сто двадцать пять вычесть тридцать один?" \ "помножь три на пятнадцать" "сложи семь и семьдесят пять" ) >[ПРЕДЛОЖЕНИЕ] строка отсечьПробелы ПРЕДЛОЖЕНИЕ $ строка строчные ПРЕДЛОЖЕНИЕ $ строка коды ПРЕДЛОЖЕНИЕ $ "#;{}_'" строка кСпискуСлов ПРЕДЛОЖЕНИЕ $ * Формирование начальных гипотез данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] для слово [ПРЕДЛОЖЕНИЕ] присвоить номер_слова [$НомерИтерации] если (вычислить являетсяЧислом $результат [слово] ) факт добавить "r;<гипотеза>;ЧИСЛО;[номер_слова];[номер_слова];0" иначе факт добавить "r;<гипотеза>;[слово];[номер_слова];[номер_слова];0" * Формирование гипотез по категориям слова данные использовать [ОБЛАСТЬ_КАТЕГОРИИ] для категория_слова (понятие всеНад $результат [слово] ) данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] факт добавить "r;<гипотеза>;[категория_слова];[номер_слова];[номер_слова];0" данные использовать [ОБЛАСТЬ_КАТЕГОРИИ] следующий данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] конец следующий данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] Интерпретация_предложения стоп * Интерпретация предложения функция Интерпретация_предложения память локальный категории режим номер_числа \ операция числ опер итог данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] присвоить режим поиск номер_числа 0 операция ? итог '' для [ПРЕДЛОЖЕНИЕ] факт сопоставитьМножество категории "r;<гипотеза>;[?рез];[$НомерИтерации];[$НомерИтерации];[?]" присвоить числ (Распознать [категории] _число: ) присвоить опер (Распознать [категории] _опер: ) если [опер] присвоить операция [опер] режим поиск иначе если [числ] если [режим] == число вычислить + "число[номер_числа]" $ [числ] иначе увеличить номер_числа присвоить "число[номер_числа]" [числ] режим число конец иначе присвоить режим поиск конец конец следующий если [операция] если (память существует $результат число1 ) если (память существует $результат число2 ) выполнить "вычислить [операция] итог [число1] [число2]" конец конец конец если [итог] == '' >Не знаю. :( иначе >Ответ: [итог] конец возврат функция Распознать множество_строк префикс_строки память локальный рез длина строка размер длина [префикс_строки] присвоить рез '' для [множество_строк] если [рез] == '' если (строка копировать $результат [$ОбъектЦикла] 1 [длина] ) == [префикс_строки] строка удалить рез [$ОбъектЦикла] 1 [длина] конец конец следующий присвоить $результат [рез] возврат * Инициализация грамматики функция Инициализация_грамматики данные использовать [ОБЛАСТЬ_КАТЕГОРИИ] факт добавить \ i;ноль;_число:0 \ i;один;_число:1 \ i;два;_число:2 \ i;три;_число:3 \ i;четыре;_число:4 \ i;пять;_число:5 \ i;шесть;_число:6 \ i;семь;_число:7 \ i;восемь;_число:8 \ i;девять;_число:9 \ i;десять;_число:10 \ i;одиннадцать;_число:11 \ i;двеннадцать;_число:12 \ i;триннадцать;_число:13 \ i;четырнадцать;_число:14 \ i;пятнадцать;_число:15 \ i;шестнадцать;_число:16 \ i;семнадцать;_число:17 \ i;восемнадцать;_число:18 \ i;девятнадцать;_число:19 \ i;двадцать;_число:20 \ i;тридцать;_число:30 \ i;сорок;_число:40 \ i;пятьдесят;_число:50 \ i;шестьдесят;_число:60 \ i;семьдесят;_число:70 \ i;восемьдесят;_число:80 \ i;девяносто;_число:90 \ i;сто;_число:100 \ i;двести;_число:200 \ i;триста;_число:300 \ i;четыреста;_число:400 \ i;пятьсот;_число:500 \ i;шестьсот;_число:600 \ i;семьсот;_число:700 \ i;восемьсот;_число:800 \ i;девятьсот;_число:900 \ i;сложить;_опер:+ \ i;сложи;_опер:+ \ i;прибавить;_опер:+ \ i;прибавь;_опер:+ \ i;плюс;_опер:+ \ i;вычесть;_опер:- \ i;вычти;_опер:- \ i;минус;_опер:- \ i;умножить;_опер:* \ i;умножь;_опер:* \ i;помножить;_опер:* \ i;помножь;_опер:* \ i;разделить;_опер:/ \ i;раздели;_опер:/ \ i;поделить;_опер:/ \ i;подели;_опер:/ \ i;_опер:+;_операция \ i;_опер:-;_операция \ i;_опер:*;_операция \ i;_опер:/;_операция *данные показать возврат