theorem
System.simFn_fn_set_of
{S T : Type u}
{sys : System S T}
[DecidableEq S]
{f : S → T}
[hf : sys.SimFn f]
{s : S}
{t : T}
(h : sys.validTr s t)
:
theorem
System.simp_path'_of_cons_and_tr_eq_some
{S T : Type u}
{sys : System S T}
{a b : S}
{t : T}
{ts : List T}
(h₁ : sys.simp_path' a (t :: ts))
(h₂ : sys.tr a t = some b)
:
sys.simp_path' b ts
theorem
System.simp_path'_of_prefix_simp_path'
{S T : Type u}
{sys : System S T}
{a : S}
{ts xs : List T}
(h₁ : sys.simp_path' a ts)
(h₂ : xs <+: ts)
:
sys.simp_path' a xs
@[simp]
theorem
System.exi_simp_path_prefix_of_not_simp_path'
{S T : Type u}
{sys : System S T}
{a : S}
{ts : List T}
(h₁ : ¬sys.simp_path' a ts)
:
theorem
System.simulate_congr_rel
{S T : Type u}
{sys : System S T}
{f g : S → T}
{r : S → S → Prop}
{a₁ a₂ : S}
{n : ℕ}
[hf : sys.SimFn f]
[hg : sys.SimFn g]
[ha₁ : sys.WF a₁]
[ha₂ : sys.WF a₂]
(h₁ : r a₁ a₂)
(h₂ :
∀ k < n,
∀ (b₁ b₂ : S),
sys.simulate f a₁ k = (b₁, 0) →
sys.simulate g a₂ k = (b₂, 0) →
r b₁ b₂ →
(sys.hasTr b₁ ↔ sys.hasTr b₂) ∧ ∀ (c₁ c₂ : S), sys.tr b₁ (f b₁) = some c₁ → sys.tr b₂ (g b₂) = some c₂ → r c₁ c₂)
:
theorem
System.simulate_congr_rel_full
{S T : Type u}
{sys : System S T}
{f g : S → T}
{r : S → S → Prop}
{a₁ a₂ b₁ : S}
{n : ℕ}
[hf : sys.SimFn f]
[hg : sys.SimFn g]
[ha₁ : sys.WF a₁]
[ha₂ : sys.WF a₂]
(h₂ : sys.simulate f a₁ n = (b₁, 0))
(h₁ : r a₁ a₂)
(h₃ :
∀ k < n,
∀ (b₁ b₂ c₁ : S),
sys.simulate f a₁ k = (b₁, 0) →
sys.simulate g a₂ k = (b₂, 0) →
r b₁ b₂ → sys.tr b₁ (f b₁) = some c₁ → ∃ (c₂ : S), sys.tr b₂ (g b₂) = some c₂ ∧ r c₁ c₂)
:
theorem
System.simulate_congr_rel'
{S T : Type u}
{sys : System S T}
{f g : S → T}
{r : S → S → Prop}
{a₁ a₂ : S}
{n : ℕ}
[hf : sys.SimFn f]
[hg : sys.SimFn g]
[ha₁ : sys.WF a₁]
[ha₂ : sys.WF a₂]
(h₂ : (sys.simulate f a₁ n).2 = 0)
(h₁ : r a₁ a₂)
(h₃ :
∀ k < n,
∀ (b₁ b₂ c₁ : S),
sys.simulate f a₁ k = (b₁, 0) →
sys.simulate g a₂ k = (b₂, 0) →
r b₁ b₂ → sys.tr b₁ (f b₁) = some c₁ → ∃ (c₂ : S), sys.tr b₂ (g b₂) = some c₂ ∧ r c₁ c₂)
: