简介
datatype exp = Var | Const int | Add exp exp | Mult exp exp
coeffs :: exp ⟹ int list
,它将算术表达式转换为其多项式表示形式,其中多项式表示为其系数列表。例如,表达式 1+2x 将转换为 [1,2],x 将转换为 [0,1]。coeffs
保留了原始算术表达式的值算法说明
系数
primrec coeffs :: "exp ⇒ int list" where
"coeffs Var = [0,1]" |
"coeffs (Const n) = [n]" |
"coeffs (Add e1 e2) = addcoef (coeffs e1) (coeffs e2)" |
"coeffs (Mult e1 e2) = multcoef (coeffs e1) (coeffs e2)"
添加系数
fun addcoef :: "int list ⇒ int list ⇒ int list" where
"addcoef xs [] = xs" |
"addcoef [] xs = xs" |
"addcoef (x#xs) (y#ys) = (x + y) # addcoef xs ys"
multicoef
[1,2] * [3,4] -> [1*3,1*4] + [0,2*3,2*4] ⟹ [3,10,8]
(1 + 2x)(3 + 4x) ⟹ 1(3) + 1(4x) + 2x(3) + 2x(4x) ⟹ 3 + 10x + 8x^2
fun multcoef :: "int list ⇒ int list ⇒ int list" where
"multcoef [] _ = []" |
"multcoef _ [] = []" |
"multcoef (x#xs) ys = addcoef (map (λy. x * y) ys) (0 # multcoef xs ys)"
验证“系数”
背景:
eval :: exp ⟹ int ⟹ int
计算给定整数的算术表达式 x
evalp :: int list ⟹ int ⟹ int
计算给定整数 x
处的多项式。证明:
lemma "∀ x. evalp (coeffs e) x = eval e x"
apply(induction e)
apply(auto)
证明状态:
proof (prove)
goal (1 subgoal):
1. ⋀e1 e2 x.
⟦∀x. evalp (coeffs e1) x = eval e1 x;
∀x. evalp (coeffs e2) x = eval e2 x⟧
⟹ evalp (multcoef (coeffs e1) (coeffs e2)) x =
eval e1 x * eval e2 x
由于引理,“addcoef”案例由
auto
证明:
lemma addcoef_evalp[simp]: "∀ x. evalp (addcoef xs ys) x = evalp xs x + evalp ys x"
apply(induction xs rule: addcoef.induct)
apply(simp_all add: algebra_simps)
done
尝试对“multcoef”使用相同的策略,但证明被卡住了:
lemma multcoef_evalp[simp]: "∀ x. evalp (multcoef xs ys) x = evalp xs x * evalp ys x"
apply(induction xs rule: multcoef.induct)
apply(auto)
oops
状态:
proof (prove)
goal (1 subgoal):
1. ⋀x xs v va xa.
∀x. evalp (multcoef (v # va) xs) x = (v + x * evalp va x) * evalp xs x ⟹
v * x + xa * (evalp (map ((*) v) xs) xa + evalp (multcoef va (x # xs)) xa) =
(v + xa * evalp va xa) * (x + xa * evalp xs xa)
结论
完整代码供参考:
theory pol imports Main
begin
datatype exp = Var | Const int | Add exp exp | Mult exp exp
-- eval: Evaluates an arithmetic expression for a given integer x
primrec eval :: "exp ⇒ int ⇒ int" where
"eval Var x = x" |
"eval (Const a) x = a" |
"eval (Add a b) x = eval a x + eval b x" |
"eval (Mult a b) x = eval a x * eval b x"
-- evalp: Evaluates a polynomial represented as a list of coefficients for a given integer x
primrec evalp :: "int list ⇒ int ⇒ int" where
"evalp [] x = 0" |
"evalp (a#as) x = a + x * evalp as x"
-- addcoef: Adds two polynomials by summing their corresponding coefficients
fun addcoef :: "int list ⇒ int list ⇒ int list" where
"addcoef xs [] = xs" |
"addcoef [] xs = xs" |
"addcoef (x#xs) (y#ys) = (x + y) # addcoef xs ys"
-- multcoef: Multiplies two polynomials by performing a convolution of their coefficients
fun multcoef :: "int list ⇒ int list ⇒ int list" where
"multcoef [] _ = []" |
"multcoef _ [] = []" |
"multcoef (x#xs) ys = addcoef (map (λy. x * y) ys) (0 # multcoef xs ys)"
-- coeffs: Transforms an arithmetic expression into a polynomial represented as a list of coefficients
primrec coeffs :: "exp ⇒ int list" where
"coeffs Var = [0,1]" |
"coeffs (Const n) = [n]" |
"coeffs (Add e1 e2) = addcoef (coeffs e1) (coeffs e2)" |
"coeffs (Mult e1 e2) = multcoef (coeffs e1) (coeffs e2)"
(* for addcoef_evalp *)
lemma [simp]: "addcoef [] xs = xs"
apply(induction xs)
apply(auto)
done
lemma addcoef_evalp[simp]: "∀ x. evalp (addcoef xs ys) x = evalp xs x + evalp ys x"
apply(induction xs rule: addcoef.induct)
apply(simp_all add: algebra_simps)
done
(* for multcoef_evalp *)
lemma [simp]: "multcoef xs [] = []"
apply(induction xs)
apply auto
done
lemma multcoef_evalp[simp]: "∀ x. evalp (multcoef xs ys) x = evalp xs x * evalp ys x"
apply(induction xs rule: multcoef.induct)
apply(auto)
oops (* stuck here, if this resolved then theorem below fully solved *)
theorem "∀ x. evalp (coeffs e) x = eval e x"
apply(induction e)
apply(auto)
oops
end
您的代码没有什么特别的。只是标准的事情要做。