Require Import List Permutation.

From Undecidability.ILL Require Import ILL.

Set Implicit Arguments.

Local Infix "~p" := (@Permutation _) (at level 70).

Notation eill_vars := .

Inductive eill_cmd : Set :=
  | in_eill_cmd_inc : eill_vars eill_vars eill_vars eill_cmd
  | in_eill_cmd_dec : eill_vars eill_vars eill_vars eill_cmd
  | in_eill_cmd_fork : eill_vars eill_vars eill_vars eill_cmd.

Notation LL_INC := in_eill_cmd_inc.
Notation LL_DEC := in_eill_cmd_dec.
Notation LL_FORK := in_eill_cmd_fork.

Definition eill_cmd_vars c :=
  match c with
    | LL_INC a p q a::p::q::nil
    | LL_DEC a p q a::p::q::nil
    | LL_FORK p q r p::q::r::nil
  end.


Definition eill_cmd_map c :=
  match c with
    | LL_INC a p q (£a £p) £ q
    | LL_DEC a p q £a £p £ q
    | LL_FORK p q r (£p & £q) £ r
  end.


Section GeILL.

  Reserved Notation "Σ ; Γ ⊦ u" (at level 70, no associativity).

  Inductive G_eill (Σ : list eill_cmd) : list eill_vars eill_vars Prop :=
    | in_geill_ax : u, Σ; u:: u
    | in_geill_perm : Γ Δ p, Γ p Δ Σ; Γ p
                                                               Σ; Δ p
    | in_geill_inc : Γ a p q, In (LL_INC a p q) Σ Σ; a::Γ p
                                                               Σ; Γ q
    | in_geill_dec : Γ Δ p q r, In (LL_DEC p q r) Σ Σ; Γ p
                                                               Σ; Δ q
                                                               Σ; ΓΔ r
    | in_geill_fork : Γ p q r, In (LL_FORK p q r) Σ Σ; Γ p
                                                               Σ; Γ q
                                                               Σ; Γ r
  where "Σ ; Γ ⊦ u" := (G_eill Σ Γ u).

End GeILL.

Definition EILL_SEQUENT := (list eill_cmd * list eill_vars * eill_vars)%type.

Definition EILL_PROVABILITY (c : EILL_SEQUENT) := match c with (Σ,Γ,u) G_eill Σ Γ u end.