Skip to content

Instantly share code, notes, and snippets.

@hatsugai
Created October 12, 2019 08:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hatsugai/45409be0356320503802161bf5c970b3 to your computer and use it in GitHub Desktop.
Save hatsugai/45409be0356320503802161bf5c970b3 to your computer and use it in GitHub Desktop.
(* Isabelle 2014 *)
theory Stream imports Main begin
codatatype 'a stream = SCons (shd:'a) (stl:"'a stream")
coinductive_set
sle :: "(('a::order) stream * 'a stream) set"
where
sle: "shd s <= shd t &
(shd s = shd t --> (stl s, stl t) : sle)
==> (s, t) : sle"
lemma "(s, t) : sle ==> (t, u) : sle ==> (s, u) : sle"
apply(rule_tac X="%s u. EX t. (s, t) : sle & (t, u) : sle" in sle.coinduct)
apply(auto)
apply (metis order_trans sle.cases)
by (metis antisym sle.simps)
primcorec
sadd :: "('a::linordered_field) stream => 'a stream => 'a stream"
where
"sadd s t = SCons (shd s + shd t) (sadd (stl s) (stl t))"
lemma "(s1, s2) : sle ==> (t1, t2) : sle ==> (sadd s1 t1, sadd s2 t2) : sle"
apply(rule_tac X="%u1 u2. EX s1 s2 t1 t2. u1 = sadd s1 t1 & u2 = sadd s2 t2 & (s1, s2) : sle & (t1, t2) : sle" in sle.coinduct)
apply(auto)
apply (metis add_mono_thms_linordered_semiring(1) sle.cases)
by (metis add_le_cancel_left add_le_cancel_right antisym sle.cases)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment