Step
*
of Lemma
mul-polynom-val
∀[n:ℕ]. ∀[p,q:polyform(n)]. ∀[l:{l:ℤ List| n ≤ ||l||} ].  (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)
BY
{ ((Assert ⌜∀k:ℕ
              ∀[n:ℕ]. ∀[p,q:polyform(n)].
                (((tree_size(p) + tree_size(q)) ≤ k)
                
⇒ (∀[l:{l:ℤ List| n ≤ ||l||} ]. (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)))⌝⋅
   THENM (Auto THEN InstHyp [⌜tree_size(p) + tree_size(q)⌝;⌜n⌝;⌜p⌝;⌜q⌝] 1⋅ THEN Auto)
   )
   THEN CompleteInductionOnNat
   THEN Auto
   THEN (DVar `p' THEN OnVar `p' DatatypeD)
   THEN DVar `q'
   THEN OnVar `q' DatatypeD
   THEN All Reduce
   THEN RecUnfold `tree_size` (-2)
   THEN Reduce -2
   THEN RecUnfold `mul-polynom` 0
   THEN Reduce 0) }
1
1. k : ℕ
2. ∀k:ℕk
     ∀[n:ℕ]. ∀[p,q:polyform(n)].
       (((tree_size(p) + tree_size(q)) ≤ k) 
⇒ (∀[l:{l:ℤ List| n ≤ ||l||} ]. (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)))
3. n : ℕ
4. p1 : ℤ
5. True
6. q1 : ℤ
7. True
8. 0 ≤ k
9. l : {l:ℤ List| n ≤ ||l||} 
⊢ if p1=0 then polyconst(0) else if p1=1 then tree_leaf(q1) else eval a = p1 * q1 in tree_leaf(a)@l
= (tree_leaf(p1)@l * tree_leaf(q1)@l)
∈ ℤ
2
1. k : ℕ
2. ∀k:ℕk
     ∀[n:ℕ]. ∀[p,q:polyform(n)].
       (((tree_size(p) + tree_size(q)) ≤ k) 
⇒ (∀[l:{l:ℤ List| n ≤ ||l||} ]. (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)))
3. n : ℕ
4. p1 : ℤ
5. True
6. left : tree(ℤ)
7. q2 : tree(ℤ)
8. ↑(((ispolyform(left) (n - 1)) ∧b (ispolyform(q2) n)) ∧b 0 <z n)
9. (0 + (1 + tree_size(left)) + tree_size(q2)) ≤ k
10. l : {l:ℤ List| n ≤ ||l||} 
⊢ if p1=0
  then polyconst(0)
  else if p1=1
       then tree_node(left;q2)
       else eval a = mul-polynom(tree_leaf(p1);left) in
            eval b = mul-polynom(tree_leaf(p1);q2) in
              tree_node(a;b)@l
= (tree_leaf(p1)@l * tree_node(left;q2)@l)
∈ ℤ
3
1. k : ℕ
2. ∀k:ℕk
     ∀[n:ℕ]. ∀[p,q:polyform(n)].
       (((tree_size(p) + tree_size(q)) ≤ k) 
⇒ (∀[l:{l:ℤ List| n ≤ ||l||} ]. (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)))
3. n : ℕ
4. left : tree(ℤ)
5. p2 : tree(ℤ)
6. ↑(((ispolyform(left) (n - 1)) ∧b (ispolyform(p2) n)) ∧b 0 <z n)
7. q1 : ℤ
8. True
9. (((1 + tree_size(left)) + tree_size(p2)) + 0) ≤ k
10. l : {l:ℤ List| n ≤ ||l||} 
⊢ if q1=0
  then polyconst(0)
  else if q1=1
       then tree_node(left;p2)
       else eval a = mul-polynom(left;tree_leaf(q1)) in
            eval b = mul-polynom(p2;tree_leaf(q1)) in
              tree_node(a;b)@l
= (tree_node(left;p2)@l * tree_leaf(q1)@l)
∈ ℤ
4
1. k : ℕ
2. ∀k:ℕk
     ∀[n:ℕ]. ∀[p,q:polyform(n)].
       (((tree_size(p) + tree_size(q)) ≤ k) 
⇒ (∀[l:{l:ℤ List| n ≤ ||l||} ]. (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)))
3. n : ℕ
4. left : tree(ℤ)
5. p2 : tree(ℤ)
6. ↑(((ispolyform(left) (n - 1)) ∧b (ispolyform(p2) n)) ∧b 0 <z n)
7. l1 : tree(ℤ)
8. q2 : tree(ℤ)
9. ↑(((ispolyform(l1) (n - 1)) ∧b (ispolyform(q2) n)) ∧b 0 <z n)
10. (((1 + tree_size(left)) + tree_size(p2)) + (1 + tree_size(l1)) + tree_size(q2)) ≤ k
11. l : {l:ℤ List| n ≤ ||l||} 
⊢ eval aa = mul-polynom(left;l1) in
  eval ab = mul-polynom(tree_node(left;polyconst(0));q2) in
  eval ba = mul-polynom(p2;tree_node(l1;polyconst(0))) in
  eval bb = mul-polynom(p2;q2) in
  eval mid = add-polynom(ab;ba) in
  eval bb' = add-polynom(mid;tree_node(polyconst(0);bb)) in
    tree_node(aa;bb')@l
= (tree_node(left;p2)@l * tree_node(l1;q2)@l)
∈ ℤ
Latex:
Latex:
\mforall{}[n:\mBbbN{}].  \mforall{}[p,q:polyform(n)].  \mforall{}[l:\{l:\mBbbZ{}  List|  n  \mleq{}  ||l||\}  ].    (mul-polynom(p;q)@l  =  (p@l  *  q@l))
By
Latex:
((Assert  \mkleeneopen{}\mforall{}k:\mBbbN{}
                        \mforall{}[n:\mBbbN{}].  \mforall{}[p,q:polyform(n)].
                            (((tree\_size(p)  +  tree\_size(q))  \mleq{}  k)
                            {}\mRightarrow{}  (\mforall{}[l:\{l:\mBbbZ{}  List|  n  \mleq{}  ||l||\}  ].  (mul-polynom(p;q)@l  =  (p@l  *  q@l))))\mkleeneclose{}\mcdot{}
  THENM  (Auto  THEN  InstHyp  [\mkleeneopen{}tree\_size(p)  +  tree\_size(q)\mkleeneclose{};\mkleeneopen{}n\mkleeneclose{};\mkleeneopen{}p\mkleeneclose{};\mkleeneopen{}q\mkleeneclose{}]  1\mcdot{}  THEN  Auto)
  )
  THEN  CompleteInductionOnNat
  THEN  Auto
  THEN  (DVar  `p'  THEN  OnVar  `p'  DatatypeD)
  THEN  DVar  `q'
  THEN  OnVar  `q'  DatatypeD
  THEN  All  Reduce
  THEN  RecUnfold  `tree\_size`  (-2)
  THEN  Reduce  -2
  THEN  RecUnfold  `mul-polynom`  0
  THEN  Reduce  0)
Home
Index