Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.01.2009
Сообщений: 7
1

Вычислитель арифметических выражений (DCG)

25.05.2011, 16:08. Показов 2087. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Задача тривиальная : нужно реализовать синтаксический анализатор арифметических выражений и вычисление их значений. Видела решения с реализацией на VIP и с дополнительным парсером, но хочется красивое решение с использованием DCG нотации, на SWI.
Исходное выражение задается в виде списка : ['(',1,'+', 2, ')','*',3].
Накидайте простой работающий вариант с поддержкой операций +, *, скобки и целых чисел, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2011, 16:08
Ответы с готовыми решениями:

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

Создать список арифметических выражений
Определите предикат p(+List1,+List2,?List3), который из двух списков (возможно разной длины) и ...

Разбор и вычисление значений арифметических выражений
Реализовать разбор и вычисление значений арифметических выражений, атомы которого — целые 16-ричные...

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

3
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
25.05.2011, 18:30 2
Ну можно было просьбу и повежливей составить, а то "накиньте", "работающий"
Prolog
1
2
3
4
5
6
count([N],N):-number(N).
count(L,Ans):-append(A,[-|B],L),count(A,NA),count(B,NB),!,Ans is NA-NB.
count(L,Ans):-append(A,[+|B],L),count(A,NA),count(B,NB),!,Ans is NA+NB.
count(L,Ans):-append(A,[*|B],L),count(A,NA),count(B,NB),!,Ans is NA*NB.
count(L,Ans):-append(A,[/|B],L),count(A,NA),count(B,NB),!,Ans is NA/NB.
count(['('|Tail],Ans):-append(L,[')'],Tail),count(L,Ans).
1
0 / 0 / 0
Регистрация: 20.01.2009
Сообщений: 7
26.05.2011, 00:27  [ТС] 3

простите, резковато вышло)
Спасибо за ваш вариант, только хотелось бы именно в DCG нотации записать грамматику разбора. В этом собственно даже суть вопроса - наглядно представить грамматику арифметических выражений.
Вот что получилось у нас:
Prolog
1
2
3
4
5
6
7
8
expr(Y) --> slag(Y).
expr(Y) --> slag(Y1), ['+'], expr(Y2) , {Y is Y1 + Y2}.
expr(Y) --> slag(Y1), ['-'], expr(Y2) , {Y is Y1 - Y2}.
 
slag(Y) --> mnojitel(Y).
slag(Y) --> mnojitel(Y1), ['*'], slag(Y2), {Y is Y1 * Y2}.
slag(Y) --> mnojitel(Y1), ['/'], slag(Y2), {Y is Y1 / Y2}.
mnojitel(Y) --> num(Y).
Теперь надо дополнить грамматику поддержкой скобок и операции степени. Со степенью совсем непонятно.

Добавлено через 11 минут
Ой, со степенью тоже все просто. Оказывается SWI умеет сам возводить в степень)
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
26.05.2011, 02:20 4
Вроде так действует, но не уверена, я с этой нотацией в первый раз встречаюсь
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
expr(Y) --> slag(Y1),['+'], expr(Y2) , {Y is Y1 + Y2}.
expr(Y) --> slag(Y1), ['-'], expr(Y2) , {Y is Y1 - Y2}.
expr(Y) --> slag(Y).
 
slag(Y) --> mnojitel(Y1), ['*'], slag(Y2), {Y is Y1 * Y2}.
slag(Y) --> mnojitel(Y1), ['/'], slag(Y2), {Y is Y1 / Y2}.
slag(Y) --> mnojitel(Y).
slag(Y) -->['('],expr(Y1), [')','*'], slag(Y2), {Y is Y1 * Y2}.
slag(Y) -->['('],expr(Y1), [')','/'], slag(Y2), {Y is Y1 / Y2}.
slag(Y) --> ['('],expr(Y),[')'].
 
mnojitel(Y) --> num(Y).
0
26.05.2011, 02:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2011, 02:20
Помогаю со студенческими работами здесь

DCG грамматика
Для ответа на вопрос top(). написал вот такой код, который не хочет работать: top(Sentence):-...

Набор слов и DCG
Приветствую всех. Строю DC-грамматику. sentence --> subject(P), verb(P). ...

DCG в SWI-Prolog-е
Есть простенький рабочий код: % top(). top(Sentence) :- yesno(Query, Sentence, ), ...

DCG + оператор univ/2 + вывод множества значений
Программа разбирает вопрос с использованием DCG грамматики и ищет ответ в базе знаний. БЗ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru