Definition: poly-zero
poly-zero(p) ==  tree_leaf?(p) ∧b (tree_leaf-value(p) =z 0)
Lemma: poly-zero_wf
∀[p:tree(ℤ)]. (poly-zero(p) ∈ 𝔹)
Definition: poly-int
poly-int(p) ==  tree_ind(p; tree_leaf(x)
⇒ tt; tree_node(l,r)
⇒ lz,rz.lz ∧b poly-zero(r)) 
Lemma: poly-int_wf
∀[p:tree(ℤ)]. (poly-int(p) ∈ 𝔹)
Definition: ispolyform
ispolyform(p) ==  tree_ind(p; tree_leaf(x)
⇒ λn.tt; tree_node(a,b)
⇒ ra,rb.λn.(((ra (n - 1)) ∧b (rb n)) ∧b 0 <z n)) 
Lemma: ispolyform_node_lemma
∀n,b,a:Top.  (ispolyform(tree_node(a;b)) n ~ ((ispolyform(a) (n - 1)) ∧b (ispolyform(b) n)) ∧b 0 <z n)
Lemma: ispolyform_leaf_lemma
∀n,x:Top.  (ispolyform(tree_leaf(x)) n ~ tt)
Lemma: ispolyform_wf
∀[p:tree(ℤ)]. (ispolyform(p) ∈ ℤ ⟶ 𝔹)
Definition: polyform
polyform(n) ==  {p:tree(ℤ)| ↑(ispolyform(p) n)} 
Lemma: polyform_wf
∀[n:ℤ]. (polyform(n) ∈ Type)
Lemma: value-type-polyform
∀[n:ℤ]. value-type(polyform(n))
Lemma: polyform-subtype
∀[n,m:ℕ].  polyform(n) ⊆r polyform(m) supposing n ≤ m
Definition: polynom
polynom(n) ==  {p:polyform(n)| (↑poly-int(p)) 
⇒ (↑tree_leaf?(p))} 
Lemma: polynom_wf
∀[n:ℤ]. (polynom(n) ∈ Type)
Definition: polyconst
polyconst(k) ==  tree_leaf(k)
Lemma: polyconst_wf
∀[k,n:ℤ].  (polyconst(k) ∈ polynom(n))
Definition: polyvar
polyvar(v)==r if v=0 then tree_node(tree_leaf(0);tree_leaf(1)) else eval a = polyvar(v - 1) in tree_node(a;tree_leaf(0))
Lemma: polyvar_wf
∀[v:ℕ]. (polyvar(v) ∈ polynom(v + 1))
Definition: poly-val-fun
poly-val-fun(p) ==
  tree_ind(p;
           tree_leaf(x)
⇒ λl.x;
           tree_node(a,b)
⇒ ra,rb.λl.eval t = tl(l) in
                                     eval av = ra t in
                                     eval bv = rb l in
                                       if bv=0 then av else eval h = hd(l) in av + (h * bv)) 
Lemma: poly-val-fun_wf
∀[n:ℕ]. ∀[p:polyform(n)].  (poly-val-fun(p) ∈ {l:ℤ List| n ≤ ||l||}  ⟶ ℤ)
Definition: poly-int-val
p@l ==  poly-val-fun(p) l
Lemma: poly-int-val_wf
∀[n:ℕ]. ∀[p:polyform(n)]. ∀[l:{l:ℤ List| n ≤ ||l||} ].  (p@l ∈ ℤ)
Lemma: polyvar-val
∀[v:ℕ]. ∀[l:{l:ℤ List| v < ||l||} ].  (polyvar(v)@l = l[v] ∈ ℤ)
Lemma: polyconst_val_lemma
∀l,k:Top.  (polyconst(k)@l ~ k)
Lemma: poly-zero-val
∀[p:tree(ℤ)]. ∀[l:Top]. (p@l = 0 ∈ ℤ) supposing ↑poly-zero(p)
Lemma: poly-int-value
∀[p:tree(ℤ)]. ∀[l:Top List]. (p@l = p@[] ∈ ℤ) supposing ↑poly-int(p)
Definition: add-polynom
add-polynom(p;q)
==r if tree_leaf?(p)
      then if tree_leaf?(q)
           then eval a = tree_leaf-value(p) + tree_leaf-value(q) in
                tree_leaf(a)
           else eval a = add-polynom(p;tree_node-left(q)) in
                eval b = tree_node-right(q) in
                  tree_node(a;b)
           fi 
    if tree_leaf?(q) then eval a = add-polynom(tree_node-left(p);q) in eval b = tree_node-right(p) in   tree_node(a;b)
    else eval a = add-polynom(tree_node-left(p);tree_node-left(q)) in
         eval b = add-polynom(tree_node-right(p);tree_node-right(q)) in
           if poly-zero(b) ∧b poly-int(a) then a else tree_node(a;b) fi 
    fi 
Lemma: add-polynom_wf
∀[n:ℕ]. ∀[p,q:polyform(n)].  (add-polynom(p;q) ∈ polyform(n))
Lemma: add-polynom-val
∀[n:ℕ]. ∀[p,q:polyform(n)]. ∀[l:{l:ℤ List| n ≤ ||l||} ].  (add-polynom(p;q)@l = (p@l + q@l) ∈ ℤ)
Definition: mul-polynom
mul-polynom(p;q)
==r if tree_leaf?(p)
      then if tree_leaf-value(p)=0
           then polyconst(0)
           else if tree_leaf-value(p)=1
                then q
                else if tree_leaf?(q)
                     then eval a = tree_leaf-value(p) * tree_leaf-value(q) in
                          tree_leaf(a)
                     else eval a = mul-polynom(p;tree_node-left(q)) in
                          eval b = mul-polynom(p;tree_node-right(q)) in
                            tree_node(a;b)
                     fi 
    if tree_leaf?(q)
      then if tree_leaf-value(q)=0
           then polyconst(0)
           else if tree_leaf-value(q)=1
                then p
                else eval a = mul-polynom(tree_node-left(p);q) in
                     eval b = mul-polynom(tree_node-right(p);q) in
                       tree_node(a;b)
    else eval aa = mul-polynom(tree_node-left(p);tree_node-left(q)) in
         eval ab = mul-polynom(tree_node(tree_node-left(p);polyconst(0));tree_node-right(q)) in
         eval ba = mul-polynom(tree_node-right(p);tree_node(tree_node-left(q);polyconst(0))) in
         eval bb = mul-polynom(tree_node-right(p);tree_node-right(q)) in
         eval mid = add-polynom(ab;ba) in
         eval bb' = add-polynom(mid;tree_node(polyconst(0);bb)) in
           tree_node(aa;bb')
    fi 
Lemma: mul-polynom_wf
∀[n:ℕ]. ∀[p,q:polyform(n)].  (mul-polynom(p;q) ∈ polyform(n))
Lemma: mul-polynom-val
∀[n:ℕ]. ∀[p,q:polyform(n)]. ∀[l:{l:ℤ List| n ≤ ||l||} ].  (mul-polynom(p;q)@l = (p@l * q@l) ∈ ℤ)
Definition: int_term_to_polynom
int_term_to_polynom(t) ==
  int_term_ind(t;
               itermConstant(c)
⇒ polyconst(c);
               itermVar(v)
⇒ polyvar(v);
               itermAdd(l,r)
⇒ rl,rr.eval p = rl in
                                     eval q = rr in
                                       add-polynom(p;q);
               itermSubtract(l,r)
⇒ rl,rr.eval p = rl in
                                          eval q = rr in
                                          eval mq = mul-polynom(polyconst(-1);q) in
                                            add-polynom(p;mq);
               itermMultiply(l,r)
⇒ rl,rr.eval p = rl in
                                          eval q = rr in
                                            mul-polynom(p;q);
               itermMinus(x)
⇒ rx.eval p = rx in
                                  mul-polynom(polyconst(-1);p)) 
Home
Index