I'm formalizing the metatheory of first-order logic with Coq. I want to enumerate all expressions of any first-order language.
The syntax of terms and formulae are:
Section SYNTAX.
Definition ivar : Set := nat.
Let arity : Set := nat.
#[projections(primitive)]
Record language : Type :=
{ function_symbols : Set
; constant_symbols : Set
; relation_symbols : Set
; function_arity_table : function_symbols -> arity
; relation_arity_table : relation_symbols -> arity
}.
Context {L : language}.
Inductive trm : Set :=
| Var_trm (x : ivar) : trm
| Fun_trm (f : L.(function_symbols)) (ts : trms (L.(function_arity_table) f)) : trm
| Con_trm (c : L.(constant_symbols)) : trm
with trms : arity -> Set :=
| O_trms : trms O
| S_trms (n : arity) (t : trm) (ts : trms n) : trms (S n).
Inductive frm : Set :=
| Rel_frm (r : L.(relation_symbols)) (ts : trms (L.(relation_arity_table) r)) : frm
| Eqn_frm (t1 : trm) (t2 : trm) : frm
| Neg_frm (p1 : frm) : frm
| Imp_frm (p1 : frm) (p2 : frm) : frm
| All_frm (y : ivar) (p1 : frm) : frm.
Variable enum_function_symbols : nat -> L.(function_symbols).
Variable enum_constant_symbols : nat -> L.(constant_symbols).
Definition enum_trm : nat -> trm. Admitted.
Definition enum_trms {n : arity} : nat -> trms n. Admitted.
Variable enum_relation_symbols : nat -> L.(relation_symbols).
Definition enum_frm : nat -> frm. Admitted.
End SYNTAX.
How can I define enum_trm
, enum_trms
, and enum_frm
which must be surjective? Any idea?