мой вопрос относительно Exercise 2.11 в книге Железобетонные семантике (http://concrete-semantics.org/):Isabelle книга Упражнение 2.11: Преобразование выражений к полиномиальной форме
Define арифметических выражений в одной переменной над целыми числами (типа int
) в качестве типа данных:
datatype exp = Var | Const int | Add exp exp | Mult exp exp
Определим функцию eval :: exp => int => int
таким образом, что оценивает eval e x
е в значение х. Полином можно представить в виде списка коэффициентов, начиная с константы . Например, [4, 2, -1, 3] представляет многочлен 4+2x-x^2+3x^3
.
Определить функцию evalp :: int list => int => int
, которая оценивает значение полинома в данного значения. Определите функцию coeffs :: exp => int list
, которая преобразует выражение в многочлен. Это может потребовать вспомогательных функций. Докажите, что coeffs сохраняет значение выражения: evalp (coeffs e) x = eval e x
.
--- Конец
Это все довольно просто, пока вы не получите coeffs
. Нам приходилось иметь дело с выражениями, такими как (X + X)*(2*X + 3*X*X)
, которые должны быть рекурсивно расширены снизу вверх, используя дистрибутивный закон до его полиномиальной формы. Получающееся выражение может по-прежнему быть чем-то вроде (X*X + X*2*X + 3*X*X + 4*X*X*X)
, поэтому необходимо нормализовать условия продукта (так, например, X*2*X
становится 2*X*X
), собирайте вместе как термины и, наконец, заказывайте их в порядке возрастания! Это кажется намного более сложным, чем любое из упражнений до сих пор, что я задаюсь вопросом, не хватает ли я чего-то или слишком усложняет его.