Comment: int_1_summary
Integer inequalities, subtypes, and 
induction lemmas for subtypes.

Comment: int_1_intro
Definitions of inequality predicates on integers and
common integer subtypes. 

Also includes induction lemmas for naturals, and
experiment proving theorem with Ycombinator extract. 

Definition: is_int
is_int(x) ==  eval v = x in isint(v)

Lemma: is_int_wf
∀[T:Type]. ∀[x:T]. (is_int(x) ∈ 𝔹) supposing value-type(T) ∧ (T ⊆r Base)

Lemma: assert-is_int
∀[T:Type]. ∀[x:T]. uiff(↑is_int(x);x ∈ ℤ) supposing value-type(T) ∧ (T ⊆r Base)

Definition: int?
int?(x) ==  eval v = x in if v is an integer then inl v else inr v 

Lemma: int?_wf
∀[T:Type]. ∀[x:T]. (int?(x) ∈ {y:ℤ| y ~ x}  + T) supposing value-type(T) ∧ (T ⊆r Base)

Comment: ge_gt_wf_com
These wf lemmas are used by EqCD
during rewriting to ensure that subterms 
come out in right order.

Lemma: comb_for_gt_wf
λi,j,z. (i > j) ∈ i:ℤ ⟶ j:ℤ ⟶ (↓True) ⟶ ℙ

Lemma: comb_for_ge_wf
λi,j,z. (i ≥ j ) ∈ i:ℤ ⟶ j:ℤ ⟶ (↓True) ⟶ ℙ

Lemma: comb_for_le_wf
λi,j,z. (i ≤ j) ∈ ℤ ⟶ ℤ ⟶ (↓True) ⟶ ℙ

Definition: lele
i ≤ j ≤ k ==  (i ≤ j) ∧ (j ≤ k)

Lemma: lelt_wf
∀[x,y,z:ℤ].  (x ≤ y < z ∈ ℙ)

Lemma: lele_wf
∀[x,y,z:ℤ].  (x ≤ y ≤ z ∈ ℙ)

Lemma: eq_int_eq_true_intro
∀[i,j:ℤ].  (i =z j) ~ tt supposing i = j ∈ ℤ

Lemma: eq_int_eq_false_intro
∀[i,j:ℤ].  (i =z j) ~ ff supposing ¬(i = j ∈ ℤ)

Lemma: lt_int_eq_true_elim
∀[i,j:ℤ].  i < j supposing i <z j = tt

Lemma: lt_int_eq_false_elim
∀[i,j:ℤ].  ¬i < j supposing i <z j = ff

Lemma: eq_atom_eq_true_elim
∀[x,y:Atom].  x = y ∈ Atom supposing x =a y = tt

Lemma: eq_atom_eq_false_elim
∀[x,y:Atom].  ¬(x = y ∈ Atom) supposing x =a y = ff

Lemma: int_seg_subtype
∀[m1,n1,m2,n2:ℤ].  {m1..n1-} ⊆r {m2..n2-} supposing (m2 ≤ m1) ∧ (n1 ≤ n2)

Lemma: int_seg_subtype_upper
∀[m1,n1,m2:ℤ].  {m1..n1-} ⊆r {m2...} supposing m2 ≤ m1

Lemma: upper_subtype_upper
∀[m1,m2:ℤ].  {m1...} ⊆r {m2...} supposing m2 ≤ m1

Lemma: upper_subtype_nat
∀[m:ℤ]. {m...} ⊆r ℕ supposing 0 ≤ m

Lemma: int_seg_subtype-nat
∀[m,n:ℤ].  {m..n-} ⊆r ℕ supposing 0 ≤ m

Lemma: subtype_rel-int_seg
∀[m1,n1,m2,n2:ℤ].  {m1..n1-} ⊆r {m2..n2-} supposing (m2 ≤ m1) ∧ (n1 ≤ n2)

Lemma: comb_for_int_seg_wf
λm,n,z. {m..n-} ∈ m:ℤ ⟶ n:ℤ ⟶ (↓True) ⟶ 𝕌1

Lemma: int_seg_properties
∀[i,j:ℤ]. ∀[y:{i..j-}].  i ≤ y < j

Lemma: decidable__equal_int_seg
∀i,j:ℤ. ∀x,y:{i..j-}.  Dec(x = y ∈ {i..j-})

Definition: int_iseg
{i...j} ==  {k:ℤ| (i ≤ k) ∧ (k ≤ j)} 

Lemma: int_iseg_wf
∀[i,j:ℤ].  ({i...j} ∈ Type)

Lemma: int_iseg_properties
∀[i,j:ℤ]. ∀[y:{i...j}].  ((i ≤ y) ∧ (y ≤ j))

Definition: increasing
increasing(f;k) ==  ∀i:ℕk - 1. f i < f (i + 1)

Lemma: increasing_wf
∀[k:ℕ]. ∀[f:ℕk ⟶ ℤ].  (increasing(f;k) ∈ ℙ)

Lemma: id_increasing
∀[k:ℕ]. increasing(λi.i;k)

Lemma: increasing_implies
∀[k:ℕ]. ∀[f:ℕk ⟶ ℤ].  {∀[x,y:ℕk].  f x < f y supposing x < y} supposing increasing(f;k)

Lemma: increasing_implies_le
∀[k:ℕ]. ∀[f:ℕk ⟶ ℤ].  {∀[x,y:ℕk].  (f x) ≤ (f y) supposing x ≤ y} supposing increasing(f;k)

Lemma: increasing_le
∀[k,m:ℕ].  k ≤ m supposing ∃f:ℕk ⟶ ℕm. increasing(f;k)

Lemma: increasing_is_id
∀[k:ℕ]. ∀[f:ℕk ⟶ ℕk].  ∀[i:ℕk]. ((f i) = i ∈ ℤ) supposing increasing(f;k)

Lemma: increasing_lower_bound
∀[k:ℕ]. ∀[f:ℕk ⟶ ℤ]. ∀[x:ℕk].  ((f 0) + x) ≤ (f x) supposing increasing(f;k)

Lemma: int_lt_to_int_upper
∀i:ℤ. ∀[A:{i + 1...} ⟶ ℙ]. ({∀j:ℤ. A[j] supposing i < j} ⇐⇒ {∀j:{i + 1...}. A[j]})

Lemma: int_lt_to_int_upper_uniform
∀i:ℤ. ∀[A:{i + 1...} ⟶ ℙ]. ({∀[j:ℤ]. A[j] supposing i < j} ⇐⇒ {∀[j:{i + 1...}]. A[j]})

Lemma: int_le_to_int_upper
∀i:ℤ. ∀[A:{i...} ⟶ ℙ]. ({∀j:ℤ. A[j] supposing i ≤ j} ⇐⇒ {∀j:{i...}. A[j]})

Lemma: int_le_to_int_upper_uniform
∀i:ℤ. ∀[A:{i...} ⟶ ℙ]. ({∀[j:ℤ]. A[j] supposing i ≤ j} ⇐⇒ {∀[j:{i...}]. A[j]})

Comment: INT_INCLUSIONS_tcom
Inclusion relations between integer subypes

Lemma: nat_plus_inc
ℕ+ ⊆r ℕ

Lemma: nat_plus_inc_int_nzero
ℕ+ ⊆r ℤ-o

Comment: INDUCTION_tcom
Induction over naturals 
=======================

Use nat_ind_a or comp_nat_ind_a normally.
Use tactics when require no wf subgoals
  involving goal being proved. (e.g. when proving
  wf lemmas). 

Lemma: nat_ind
∀[P:ℕ ⟶ ℙ{k}]. (P[0] ⇒ (∀i:ℕ+. (P[i - 1] ⇒ P[i])) ⇒ {∀j:ℕ. P[j]})

Lemma: rec-nat-induction
∀[P:ℕ ⟶ ℙ]. (∀[n:ℕ]. (P[n] ⇒ P[n + 1])) ⇒ (∀[n:ℕ]. P[n]) supposing Top ⊆r P[0]

Lemma: complete_nat_ind
∀[P:ℕ ⟶ ℙ]. ((∀i:ℕ. ((∀j:ℕi. P[j]) ⇒ P[i])) ⇒ (∀i:ℕ. P[i]))

Definition: suptype
suptype(S; T) ==  T ⊆ S

Definition: genrec
The general recursion operator.
The definition of genrec uses fix and is a little bit
better than what AddRecDef would generate automatically 
(because AddRecDef leaves a subterm of the form (\m. g m) m 
 which can be replaced by g)⋅

letrec rec(n)=g[n; rec] in rec  ==  fix((λrec,n. g[n; rec]))

Definition: genrec-ap
letrec rec(n)=g[n; rec] in rec(x) ==  fix((λrec,n. g[n; rec])) x

Lemma: complete_nat_measure_ind
∀[T:Type]. ∀[measure:T ⟶ ℕ]. ∀[P:T ⟶ ℙ].
  ((∀i:T. ((∀j:{j:T| measure[j] < measure[i]} . P[j]) ⇒ P[i])) ⇒ (∀i:T. P[i]))

Lemma: uniform_nat_measure_ind
∀[T:Type]. ∀[measure:T ⟶ ℕ]. ∀[P:T ⟶ ℙ].
  ((∀[i:T]. ((∀[j:{j:T| measure[j] < measure[i]} ]. P[j]) ⇒ P[i])) ⇒ (∀[i:T]. P[i]))

Lemma: complete_nat_ind_with_y
∀[P:ℕ ⟶ ℙ{k}]. ((∀i:ℕ. ((∀j:ℕi. P[j]) ⇒ P[i])) ⇒ (∀i:ℕ. P[i]))

Comment: natrec notes
The 'natrec' operator ⌜letrec f(n)=g[n;f] in
                        f⌝ is really just the general recursion operator
 ⌜letrec f(n)=g[n;f] in
   f ⌝,  but we "rename" it so that we can give a wf lemma specific to the
 natural numbers.

 The definition of the genrec uses the Y combinator and is a little bit
better than what AddRecDef would generate automatically (AddRecDef leaves
a subterm of the form (\m. g m) m which can be replaced by g.⋅

Definition: natrec
The 'natrec' operator ⌜letrec f(n)=g[n;f] in
                        f⌝ is really just the general recursion operator
 ⌜letrec f(n)=g[n;f] in
   f ⌝, 
 but we "rename" it so that we can give a wf lemma specific to the
 natural numbers.⋅

letrec f(n)=g[n; f] in f ==  letrec f(n)=g[n; f] in f 

Lemma: natrec_wf
∀[T:ℕ ⟶ Type]. ∀[g:n:ℕ ⟶ (m:ℕn ⟶ T[m]) ⟶ T[n]].  (letrec f(n)=g[n;f] in f ∈ n:ℕ ⟶ T[n])

Lemma: natrec_wf_intseg
∀[k:ℤ]. ∀[T:{k...} ⟶ Type]. ∀[g:n:{k...} ⟶ (m:{k..n-} ⟶ T[m]) ⟶ T[n]].  (letrec f(n)=g[n;f] in f ∈ n:{k...} ⟶ T[n])

Lemma: genrec-unroll
∀[g,n:Top].  (letrec f(n)=g[n;f] in f  n ~ g[n;letrec f(n)=g[n;f] in f ])

Lemma: genrec-ap-unroll
∀[g,x:Top].  (letrec rec(n)=g[n;rec] in rec(x) ~ g[x;λx.letrec rec(n)=g[n;rec] in rec(x)])

Lemma: natrec-unroll
∀[g,n:Top].  (letrec f(n)=g[n;f] in f n ~ g[n;letrec f(n)=g[n;f] in f])

Lemma: complete-nat-induction
∀[P:ℕ ⟶ ℙ]. ((∀n:ℕ. ((∀m:ℕn. P[m]) ⇒ P[n])) ⇒ (∀n:ℕ. P[n]))

Lemma: complete-nat-induction-ext
∀[P:ℕ ⟶ ℙ]. ((∀n:ℕ. ((∀m:ℕn. P[m]) ⇒ P[n])) ⇒ (∀n:ℕ. P[n]))

Lemma: isint-int
∀[z:ℤ]. ∀[a,b:Top].  (if z is an integer then a else b ~ a)

Lemma: uniform-comp-nat-induction
∀[P:ℕ ⟶ ℙ]. ((∀[n:ℕ]. ((∀[m:ℕn]. P[m]) ⇒ P[n])) ⇒ (∀[n:ℕ]. P[n]))

Lemma: uniform-comp-nat-induction-TYPE-tac
∀[P:ℕ ⟶ TYPE]. ((∀[n:ℕ]. ((∀[m:ℕn]. P[m]) ⇒ P[n])) ⇒ (∀[n:ℕ]. P[n]))

Lemma: uniform-TI-less
∀[P:ℕ ⟶ ℙ]. uniform-TI(ℕ;x,y.y < x;x.P[x])

Lemma: assert_pushup_example
4 < 3 ∨ (3 ≤ 5)

Lemma: ite_rw_test
∀[n:ℕ]. ∀[i:ℕ+n].  False supposing (¬(0 = 0 ∈ ℤ)) ∧ (¬(n = 0 ∈ ℤ))

Lemma: sqequal_n-wf
∀[x,y:Base]. ∀[n:ℕ].  (x ~n y ∈ Type)

Lemma: sqequal_n_wf
∀[x,y:Base]. ∀[n:ℕ].  (x ~n y ∈ Type)

Lemma: sq_stable__sqequal_n
∀[x,y:Base]. ∀[n:ℕ].  SqStable(x ~n y)

Lemma: sqle_n-wf
∀[x,y:Base]. ∀[n:ℕ].  (x ≤n y ∈ Type)

Lemma: sqle_n_wf
∀[x,y:Base]. ∀[n:ℕ].  (x ≤n y ∈ Type)

Lemma: sqle_n_subtype_rel
∀[a,b:Base]. ∀[n:ℕ].  a ≤n b supposing a ≤n + 1 b

Lemma: sqequaln_sqlen
∀[a,b:Base]. ∀[n:ℕ].  (a ~n b) supposing ((a ≤n b) and (b ≤n a))

Lemma: sqlen_sqequaln
∀[a,b:Base]. ∀[n:ℕ].  a ≤n b supposing a ~n b

Lemma: sqequaln_symm
∀[a,b:Base]. ∀[n:ℕ].  a ~n b supposing b ~n a

Lemma: sqequal_n_add
∀x,y:Base. ∀n,m:ℕ.  ((x ~n + m y) ⇒ (x ~n y))

Definition: sqntype
sqntype(n;T) ==  ∀x,y:Base.  ((x = y ∈ T) ⇒ (x ~n y))

Lemma: sqntype_wf
∀[T:Type]. ∀[n:ℕ].  (sqntype(n;T) ∈ ℙ)

Lemma: sq_stable__sqntype
∀[T:Type]. ∀[n:ℕ].  SqStable(sqntype(n;T))

Lemma: sqntype0
∀[T:Type]. sqntype(0;T)

Lemma: sqn+1type_dep_product
∀[T:Type]. ∀[S:T ⟶ Type]. ∀[n:ℕ].  (sqntype(n + 1;t:T × S[t])) supposing ((∀t:T. sqntype(n;S[t])) and sqntype(n;T))

Lemma: sqn+1type_product
∀[T,S:Type]. ∀[n:ℕ].  (sqntype(n + 1;T × S)) supposing (sqntype(n;S) and sqntype(n;T))

Lemma: sqntype_product
∀[T,S:Type]. ∀[n:ℕ].  (sqntype(n;T × S)) supposing (sqntype(n;S) and sqntype(n;T))

Lemma: sqntype_base
∀[n:ℕ]. sqntype(n;Base)

Lemma: sqntype_subtype
∀[A,B:Type]. ∀[n:ℕ].  (sqntype(n;A)) supposing (sqntype(n;B) and (A ⊆r B))

Lemma: sqntype_subtype_base
∀[A:Type]. ∀[n:ℕ].  sqntype(n;A) supposing A ⊆r Base

Lemma: sqntype_int
∀[n:ℕ]. sqntype(n;ℤ)

Lemma: sqntype_nat
∀[n:ℕ]. sqntype(n;ℕ)

Lemma: free-from-atom-nat
∀[a:Atom1]. ∀[n:ℕ].  a#n:ℕ

Lemma: free-from-atom2-nat
∀[a:Atom2]. ∀[n:ℕ].  a#n:ℕ

Lemma: free-from-atom-int
∀[a:Atom1]. ∀[n:ℤ].  a#n:ℤ

Lemma: free-from-atom2-int
∀[a:Atom2]. ∀[n:ℤ].  a#n:ℤ

Definition: abs-val
|x| ==  if x <z 0 then -x else x fi 

Lemma: abs-val_wf
∀[x:ℤ]. (|x| ∈ ℕ)

Lemma: int_is_mono
∀[x:ℤ]. ∀[y:Base].  y ≤ x supposing x ≤ y

Lemma: gcd-properties
∀a,b:ℤ.
  ((∃c:ℤ. ((c * gcd(a;b)) = a ∈ ℤ)) ∧ (∃d:ℤ. ((d * gcd(a;b)) = b ∈ ℤ)) ∧ (∃s,t:ℤ. (gcd(a;b) = ((s * a) + (t * b)) ∈ ℤ)))

Lemma: better-gcd-properties
∀a,b:ℤ.
  ((∃c:ℤ. ((c * better-gcd(a;b)) = a ∈ ℤ))
  ∧ (∃d:ℤ. ((d * better-gcd(a;b)) = b ∈ ℤ))
  ∧ (∃s,t:ℤ. (better-gcd(a;b) = ((s * a) + (t * b)) ∈ ℤ)))

Lemma: stamps-example
∀n:ℕ. ∃i:ℕ. (∃j:ℕ [((n + 8) = ((3 * i) + (5 * j)) ∈ ℤ)])

Lemma: stamps-example-ext
∀n:ℕ. ∃i:ℕ. (∃j:ℕ [((n + 8) = ((3 * i) + (5 * j)) ∈ ℤ)])

Definition: stamps35
stamps35(n) ==  TERMOF{stamps-example-ext:o, 1:l} n

Lemma: stamps35_wf
∀n:ℕ. (stamps35(n) ∈ ∃i:ℕ. (∃j:ℕ [((n + 8) = ((3 * i) + (5 * j)) ∈ ℤ)]))

Lemma: absval_ifthenelse
∀[x:ℤ]. (|x| ~ if 0 <z x then x else -x fi )

Lemma: not-all-int_seg2
∀i,j:ℤ.  ∀[P,Q:{i..j-} ⟶ ℙ].  ((∀x:{i..j-}. (P[x] ∨ Q[x])) ⇒ (¬(∀x:{i..j-}. P[x])) ⇒ (∃x:{i..j-}. Q[x]))

Lemma: not-all-int_seg
∀i,j:ℤ.  ∀[P:{i..j-} ⟶ ℙ]. ((∀x:{i..j-}. Dec(P[x])) ⇒ (¬(∀x:{i..j-}. P[x]) ⇐⇒ ∃x:{i..j-}. (¬P[x])))

Lemma: not-not-all-int_seg-xmiddle
∀a,b:ℤ. ∀P:{a..b-} ⟶ ℙ.  (¬¬(∀i:{a..b-}. (P[i] ∨ (¬P[i]))))

Lemma: not-not-all-int_seg-shift
∀a,b:ℤ. ∀P:{a..b-} ⟶ ℙ.  ((∀i:{a..b-}. (¬¬P[i])) ⇒ (¬¬(∀i:{a..b-}. P[i])))

Definition: stable-union
stable-union(X;T;i,x.P[i; x]) ==  {x:X| ¬¬(∃i:T. P[i; x])} 

Lemma: stable-union_wf
∀[X,T:Type]. ∀[P:T ⟶ X ⟶ ℙ].  (stable-union(X;T;i,x.P[i;x]) ∈ Type)

Lemma: stable-union-decomp
∀[X,T:Type]. ∀[P:T ⟶ X ⟶ ℙ]. ∀[S:T ⟶ Type]. ∀[Q:i:T ⟶ S[i] ⟶ X ⟶ ℙ].
  stable-union(X;T;i,x.P[i;x]) ≡ stable-union(X;i:T × S[i];p,x.Q[fst(p);snd(p);x]) 
  supposing (∀x:X. ∀i:T. ∀s:S[i].  (Q[i;s;x] ⇒ (¬¬P[i;x]))) ∧ (∀x:X. ∀i:T.  (P[i;x] ⇒ (¬¬(∃s:S[i]. Q[i;s;x]))))



Home Index