Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Paradox_ua
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 14
1

Упрощение выражений на Lisp

29.04.2017, 11:39. Просмотров 1230. Ответов 8
Метки нет (Все метки)

Здравствуйте, уважаемые профессионалы и начинающие специалисты! Появилась необходимость в кратчайшие сроки реализовать небольшую программу на Lisp, суть которой состоит в упрощении арифметических выражений. К примеру, пользователь передаёт в функцию следующее выражение (+ (* 2 x) (* 2 x)) и должно вывести 4x. Раньше с подобными языками дела не имел, а сроки горят. Думаю, для спецов по данному языку подобное задание "как дважды два" . Кому не сложно и не жалко помочь, буду крайне благодарен!
Для примера (возможно, его можно как-то модифицировать под это задание) сброшу мою программу по дифференцированию на Lisp (но не уверен, что она хороша).
Заранее благодарен за ответы, с уважением.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2017, 11:39
Ответы с готовыми решениями:

Дифференцирование и упрощение алгебраических выражений
Только начала разбираться с Lisp и вот задание,не могу дописать,помогите,пожалуйста Задание Для...

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и...

Организация циклов в Lisp (bee lisp demo)
разбираюсь с простыми задачами, эти пока не знаю, как решать... помогите пожалуйста. 1. Слова в...

Упрощение выражений
Извините за трату времени , но прошу вас помочь. Дали пример по логике , но слишком много зачётов и...

Упрощение выражений
При помощи каких законов упрощаются данные выражения(фото в приложении).

8
Paradox_ua
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 14
29.04.2017, 11:42  [ТС] 2
Это программа для дифференцирования.
0
Вложения
Тип файла: txt lisp4.txt (2.2 Кб, 5 просмотров)
Paradox_ua
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 14
30.04.2017, 15:48  [ТС] 3
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(setf (get '+ 'diff) 'diff_plus)
 
(setf (get '- 'diff) 'diff_minus)
 
(setf (get '* 'diff) 'diff_mult)
 
(setf (get '/ 'diff) 'diff_div)
 
(setf (get '+ 'reduce) 'reduce_plus)
 
(setf (get '- 'reduce) 'reduce_minus)
 
(setf (get '* 'reduce) 'reduce_mult)
 
(setf (get '/ 'reduce) 'reduce_div)
 
(defun diff_g(a x)
    (cond ((atom a) (if (eql a x) 1 0))
        (t (funcall  (get (car a) 'diff) (cdr a) 'x))
    )
)
 
(defun reduce_g(l)
    (cond ((atom l) l)
        (t (funcall (get (car l) 'reduce) (cdr l)))
    )
)
 
(defun diff_plus(l x)
    (list '+ (diff_g (car l) 'x) (diff_g (cadr l) 'x))
)
 
(defun diff_minus(l x)
    (list '- (diff_g (car l) 'x) (diff_g (cadr l) 'x))
)
 
(defun diff_mult(l x)
    (list '+ (list '* (diff_g (car l) 'x) (cadr l))
             (list '* (diff_g (cadr l) 'x) (car l))
    )
)
 
(defun reduce_plus(l)
    (cond
        ((and (numberp (car l)) (zerop (car l))) (cadr l))
        ((and (numberp (cadr l)) (zerop (cadr l))) (car l))
        ((and (numberp (car l)) (numberp (cadr l))) (+ (car l) (cadr l)))
        (t (list '+ (reduce_g (car l)) (reduce_g (cadr l))))
    )
)
 
(defun reduce_minus(l)
    (cond
        ((equal (car l) (cadr l)) 0)
        ((and (numberp (car l)) (zerop (car l))) (- 0 (cadr l)))
        ((and (numberp (cadr l)) (zerop (cadr l))) (car l))
        ((and (numberp (car l)) (numberp (cadr l))) (- (car l) (cadr l)))
        (t (list '- (reduce_g (car l)) (reduce_g (cadr l))))
    )
)
 
(defun reduce_mult(l)
    (cond
        ((and (numberp (car l)) (zerop (car l))) 0)
        ((and (numberp (cadr l)) (zerop (cadr l))) 0)
        ((and (numberp (car l)) (eql 1 (car l)) (cadr l)))
        ((and (numberp (car l)) (numberp (cadr l))) (* (car l) (cadr l)))
        (t (list '* (reduce_g (car l)) (reduce_g (cadr l))))
    )
)
 
(defun reduce_div(l)
    (cond
        ((and (numberp (car l)) (zerop (car l))) 0)
        ((and (numberp (cadr l)) (zerop (cadr l))) -111111111)
        ((and (numberp (cadr l)) (eql 1 (cadr l))) (car l))
        ((and (numberp (car l)) (numberp (cadr l))) (/ (car l) (cadr l)))
        (t (list '/ (reduce_g (car l)) (reduce_g (cadr l))))
    )
)
 
(defun diff_div(l x)
    (list '/ (list '- (list '* (diff_g (car l) x) (cadr l)) (list '* (diff_g (cadr l) x) (car l))) (list '* (car l) (car l)))
)
 
(defun reduce_f(next)
    (setq prev next)
    (setq next (reduce_g prev))
    (if (equal prev next) next (reduce_f next))
)
Добавлено через 22 часа 38 минут
Мда, не думал, что это такое сложное задание, что никто не отвечает...

Добавлено через 5 часов 27 минут
Я как-то неправильно задал вопрос, или некорректно себя веду? Или задание , действительно на столько тяжёлое, что никто не берётся комментировать?
0
Catstail
Модератор
25519 / 13122 / 2461
Регистрация: 12.02.2012
Сообщений: 21,465
30.04.2017, 15:56 4
Цитата Сообщение от Paradox_ua Посмотреть сообщение
сброшу мою программу по дифференцированию на Lisp
- ты сам ее написал и хочешь, чтобы кто-то стал ее комментировать? Зачем?
0
Paradox_ua
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 14
30.04.2017, 16:33  [ТС] 5
Нет, Вы , наверное, не так поняли. Программа для дифференцирования - это уже выполненное мною задание. А сейчас необходимо решить другую программу , суть которой состоит в упрощении арифметических выражений. К примеру, пользователь передаёт в функцию следующее выражение (+ (* 2 x) (* 2 x)) и должно вывести 4x.
И не смотря, на тщательную реализацию дифференцирования, никак не могу сделать упрощение арифметических выражений, как написано выше. Собственно по этой проблеме и надеюсь на помощь и комментарии.
0
vlisp
689 / 630 / 122
Регистрация: 10.08.2015
Сообщений: 2,689
Завершенные тесты: 1
30.04.2017, 16:57 6
во первых не 4х, а (* 4 х), во вторых задача эта нетривиальна и даже коммерческие математические процессоры не всегда с ней справляются
1
Paradox_ua
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 14
30.04.2017, 17:17  [ТС] 7
Неожиданно... Мне это задание дали, как примитивное учебное. И задача именно в том , чтобы выводить 4х по тому выражению, которое дали на вход, а не (* 4 х). В этом и есть смысл упрощения выражения.
0
Catstail
Модератор
25519 / 13122 / 2461
Регистрация: 12.02.2012
Сообщений: 21,465
30.04.2017, 19:41 8
Paradox_ua, т.е выражение вводится в префиксной форме, а выводится в традиционной инфиксной? Да еще с опусканием знака умножения? Ничего не путаешь?
0
budden
198 / 99 / 4
Регистрация: 16.08.2015
Сообщений: 193
30.04.2017, 19:50 9
Лучший ответ Сообщение было отмечено Paradox_ua как решение

Решение

http://www.qrg.northwestern.edu/BPS/cps/simplify.lisp - этот код я не смотрел (например, не знаю, правильный ли он), но он похож на первую часть того, что вам нужно. Если не проходили хеш-таблицы - замените их а-списками. Это будет первая часть - упростить выражение.
Дальше вторая часть - превратить из лисповой формы в инфиксную - это вроде должно быть более-менее очевидно. Например, если у вас есть (* a b), то выводите сначала а, потом пустоту, потом b. Правда, придётся повозиться со скобками. Можете схитрить: если выражения - атомы, то не выводить скобки, а если не атомы, то выводить в любом случае, невзирая на приоритет. Т.е. а+4b у вас запишется как a + (4b), хотя скобки тут лишние. Судя по месяцу, максимум, что вам грозит - это то, что вам придётся придти на зачёт ещё раз
2
30.04.2017, 19:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2017, 19:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Упрощение выражений
Такое задание: Создать процедуру simplify (+Expr,–Result), которая выполняет упрощение выражений,...

Упрощение выражений в MathCad'e
Упростить выражения: asin(1/6) и 27cosh(3*pi). Пробовал упростить сам, но в итоге Маткад...

Упрощение и визуализация выражений
Здравствуйте. Прошу прощения если вопрос задавался. Matlab выдает решение дифура в виде:...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.