Require Export Undecidability.FOL.Syntax.Core.
Require Import Undecidability.FOL.Syntax.Theories.
From Undecidability Require Import Shared.ListAutomation.
Import ListAutomationNotations.
Require Import Vector.

Local Set Implicit Arguments.
Local Unset Strict Implicit.

Set Default Proof Using "Type".

Local Notation vec := Vector.t.

Import FragmentSyntax.
Export FragmentSyntax.


Section Tarski.

  Context {Σ_funcs : funcs_signature}.
  Context {Σ_preds : preds_signature}.


  Section Semantics.

    Variable domain : Type.

    Class interp := B_I
      {
        i_func : f : syms, vec domain (ar_syms f) domain ;
        i_atom : P : preds, vec domain (ar_preds P) Prop
      }.

    Definition env := domain.

    Context {I : interp}.

    Fixpoint eval (rho : env) (t : term) : domain :=
      match t with
      | var s s
      | func f v i_func (Vector.map (eval ) v)
      end.

    Fixpoint sat {ff : falsity_flag} (rho : env) (phi : form) : Prop :=
      match with
      | atom P v i_atom (Vector.map (eval ) v)
      | falsity False
      | bin Impl sat sat
      | quant All d : domain, sat (d .: )
      end.

  End Semantics.

  Notation "rho ⊨ phi" := (sat ) (at level 20).

End Tarski.

Arguments sat {_ _ _ _ _} _ _, {_ _ _} _ {_} _ _.
Arguments interp {_ _} _, _ _ _.

Notation "p ⊨ phi" := (sat _ p ) (at level 20).
Notation "I ⊨= phi" := ( p, sat I p ) (at level 20).
Notation "p ⊫ A" := ( psi, A sat _ p ) (at level 20).

Section Defs.

  Context {Σ_funcs : funcs_signature}.
  Context {Σ_preds : preds_signature}.
  Context {ff : falsity_flag}.

  Definition classical D (I : interp D) :=
     rho phi psi, ((( ) ) ).

  Definition valid_theory_C (C : D (I:interp D), Prop) (T:theory) phi :=
       D (I : interp D) rho, C D I ( psi, T ) .
  Definition valid_ctx_C (C : D (I:interp D), Prop) A phi :=
       D (I : interp D) rho, C D I A .
  Definition valid_C (C : D (I:interp D), Prop) phi :=
       D (I : interp D) rho, C D I .
  Definition valid_ctx A phi := D (I : interp D) rho, A .
  Definition valid_theory (T:theory) phi := D (I : interp D) rho, ( psi, T ) .
  Definition valid phi := D (I : interp D) rho, .
  Definition valid_L A := D (I : interp D) rho, A.
  Definition satis phi := D (I : interp D) rho, .
  Definition satis_L A := D (I : interp D) rho, A.

End Defs.