# Abstract Syntax
Abstract syntax is *not* regarded as a domain.
In conventional Scott–Strachey style denotational semantics,
abstract syntax is generally first-order:
terms are finite, totally-defined elements.
A variable is written `x n`. The argument `n` merely distinguishes between variables –
it is *not* a De Bruin index.
The term constructor `var` below includes variables in terms.
In Agda, mixfix notation requires argument positions `_` to be separated by characters other than spaces.
The term constructors for function abstraction and application use the Unicode character `␣` as a separator.
```agda
{-# OPTIONS --rewriting --confluence-check #-}
module Examples.LC.Abstract-Syntax where
open import Agda.Builtin.Nat public using (Nat)
data Var : Set where
x : Nat → Var
variable v : Var
data Exp : Set where
var_ : Var → Exp
⦅λ_␣_⦆ : Var → Exp → Exp
⦅_␣_⦆ : Exp → Exp → Exp
variable e e₁ e₂ : Exp
```