theorem prime_smallest_factor_n : ∀n. 1 < n →
prime (smallest_factor n).
-#n #lt1n (cut (0<n)) [/2/] #posn % /2/ #m #divmmin #lt1m
+#n #lt1n (cut (0<n)) [/2/] #posn % (* bug? *) [/2/] #m #divmmin #lt1m
@le_to_le_to_eq
[@divides_to_le // @lt_O_smallest_factor //
|>smallest_factor_to_min // @true_to_le_min //
#A #a1 #a2 #l1 #l2 #Heq destruct //
qed.
+(* comparing lists *)
+
+lemma compare_append : ∀A,l1,l2,l3,l4. l1@l2 = l3@l4 →
+∃l:list A.(l1 = l3@l ∧ l4=l@l2) ∨ (l3 = l1@l ∧ l2=l@l4).
+#A #l1 elim l1
+ [#l2 #l3 #l4 #Heq %{l3} %2 % // @Heq
+ |#a1 #tl1 #Hind #l2 #l3 cases l3
+ [#l4 #Heq %{(a1::tl1)} %1 % // @sym_eq @Heq
+ |#a3 #tl3 #l4 normalize in ⊢ (%→?); #Heq cases (Hind l2 tl3 l4 ?)
+ [#l * * #Heq1 #Heq2 %{l}
+ [%1 % // >Heq1 >(cons_injective_l ????? Heq) //
+ |%2 % // >Heq1 >(cons_injective_l ????? Heq) //
+ ]
+ |@(cons_injective_r ????? Heq)
+ ]
+ ]
+ ]
+qed.
(**************************** iterators ******************************)
let rec map (A,B:Type[0]) (f: A → B) (l:list A) on l: list B ≝
λn,t.∃qin,cin.
only_bits qin ∧ cin ≠ bar ∧ |qin| = S n ∧ t = bar::qin@[cin].
-lemma compare_append : ∀A,l1,l2,l3,l4. l1@l2 = l3@l4 →
-∃l:list A.(l1 = l3@l ∧ l4=l@l2) ∨ (l3 = l1@l ∧ l2=l@l4).
-#A #l1 elim l1
- [#l2 #l3 #l4 #Heq %{l3} %2 % // @Heq
- |#a1 #tl1 #Hind #l2 #l3 cases l3
- [#l4 #Heq %{(a1::tl1)} %1 % // @sym_eq @Heq
- |#a3 #tl3 #l4 normalize in ⊢ (%→?); #Heq cases (Hind l2 tl3 l4 ?)
- [#l * * #Heq1 #Heq2 %{l}
- [%1 % // >Heq1 >(cons_injective_l ????? Heq) //
- |%2 % // >Heq1 >(cons_injective_l ????? Heq) //
- ]
- |@(cons_injective_r ????? Heq)
- ]
- ]
- ]
-qed.
-
lemma table_to_list: ∀n,l,h,c. is_config n c →
(∃ll,lr.table_TM n l h = ll@c@lr) →
∃out,t. tuple_encoding n h t = (c@out) ∧ mem ? t l.