LS2NF.witness

From stdpp Require Import relations list.
From Coq Require Import ssreflect.
From LS2NF Require Import grammar.

Witness Relation Properties


Section witness.

  Context {Σ N : Type} `{!EqDecision Σ} `{!EqDecision N}.
  Context (G : grammar Σ N).

  Open Scope grammar_scope.

  Lemma witness_ε A :
    A ε G
    ε_tree A A ={ G }=> [].
  Proof.
    intros. repeat split. by constructor.
  Qed.

  Lemma witness_atom A a p :
    A atom a G
    token_tree A (a @ p) A ={ G }=> [a @ p].
  Proof.
    intros. repeat split. by constructor.
  Qed.

  Lemma witness_unary A φ t w :
    A unary (root t) φ G
    unary_tree A t A ={G}=> w
    t root t ={G}=> w app₁ φ w = true.
  Proof.
    intros Hp. split.
    - intros [? [? Ht]]. simpl in ×. invert Ht.
      eapply unary_clause_predicate_unique in Hp; eauto.
      split ⇒ //. naive_solver.
    - intros [[? [? ?]] ?]. subst. repeat split ⇒ //. econstructor; eauto.
  Qed.

  Lemma witness_binary A φ t1 t2 w2 :
    A binary (root t1) (root t2) φ G
    binary_tree A t1 t2 A ={G}=> (word t1 ++ w2)
    t1 root t1 ={G}=> word t1 t2 root t2 ={G}=> w2 app₂ φ (word t1) w2 = true.
  Proof.
    intros Hp. split.
    - intros [? [? Ht]]. simpl in ×. invert Ht.
      eapply binary_clause_predicate_unique in Hp; eauto.
      repeat split ⇒ //; naive_solver.
    - intros [[? [? ?]] [[? [? ?]] ?]]. subst. repeat split ⇒ //. econstructor; eauto.
  Qed.

End witness.