Лично я ничего не знаю о кодовых типах. Но позвольте мне все же попытаться вам помочь.
Первая опубликованная вами лемма может быть автоматически доказана sledgehammer
. Он находит доказательство с помощью функции size
, эффективно сводя задачу на natural
к той же проблеме на nat
:
by (metis Scratch.natural.size(2) n_not_Suc_n nat.size(4) size_nat)
Если вам нужна очень простая пошаговая версия этого доказательства, вы можете написать ее так:
lemma "¬(∃x. x = Successor x)"
proof clarify
fix x assume "x = Successor x"
hence "size x = size (Successor x)" by (rule subst) (rule refl)
also have "... = size x + Suc 0" by (rule natural.size)
finally have "0 = Suc 0" by (subst (asm) add_0_iff) (rule sym)
moreover have "0 ≠ Suc 0" by (rule nat.distinct(1))
ultimately show False by contradiction
qed
Если вам нужно более «элементарное» доказательство без использования натуральных чисел HOL, вы можете провести доказательство от противного, используя индукцию по вашему natural
:
lemma "¬(∃x. x = Successor x)"
proof clarify
fix x assume "x = Successor x"
thus False by (induction x) simp_all
qed
Вы в основном получаете два случая в индукции:
Zero = Successor Zero ⟹ False
⋀x. (x = Successor x ⟹ False) ⟹
Successor x = Successor (Successor x) ⟹ False
Первая подцель является прямым следствием natural.distinct(1)
, вторая может быть сведена к гипотезе индукции с помощью natural.inject
. Так как эти правила находятся в симпсете, simp_all
может решить его автоматически.
Что касается второй леммы, единственное решение, которое я могу придумать, — это явно построить бесконечный элемент, используя primcorec
:
primcorec infinity :: conat where
"infinity = CoSucc infinity"
Затем вы можете доказать свою вторую лемму, просто развернув определение:
lemma "∃x. x = CoSucc x"
proof
show "infinity = CoSucc infinity" by (rule infinity.ctr)
qed
Предупреждение: эти доказательства работают, но я не уверен, являются ли они самым простым и/или самым элегантным решением этой проблемы. Я практически ничего не знаю о типах кодовых данных или новом пакете типов данных.
person
Manuel Eberl
schedule
12.07.2014