The Lightweight Free Theorems library (Attach:LFT.agda) allows to construct so called "free theorems" with ease.

### Background

As Reynolds tells us, a type "T" can be interpreted as a relation "[T]", and every inhabitant "t" of type "T" satisfies the relation.

- if ⊢ t : T then (t,t) ∈ [T]

For complicated types T, the corresponding relation [T] can be tedious to write. A tool such as Voigtländer's (http://www-ps.iai.uni-bonn.de/ft/) can be of help. Unfortunately, that tool supports only Haskell, and has limited support for data types. The library supports full Agda, at the cost of more user involvement.

## Usage

To create a free theorem for a type such as:

Filter = (A : Set) → ( A → Bool) → List A → List A

rewrite using Π combinator:

Filter = Π Set \ A → ( A → Bool) → List A → List A

And then "quote" every symbol:

[Filter] = [Π] [Set] \ [A] → ([A] [→] [Bool]) [→] [List] [A] [→] [List] [A]

Use Agda's "normalize-term" feature to expand the relations.

The library provides the combinators [Π], [Set], and [→]. It is up to the user to add support for each data type, but that is easily done as we shall see next.

### Data types

Relations for data types are created in a similar way. To produce the relational equivalent of an inductive definition such a the above, quote each symbol, and apply the (translated) type to the original constant (twice).

data Bool : Set where true : Bool false : Bool data [Bool] : [Set] Bool Bool where [true] : [Bool] true true [false] : [Bool] false false

#### Parameters

If an inductive definition has a parameter, it must be duplicated, and an extra parameter (witnessing the relation) must be added:

data List (A : Set) : Set where nil : List A cons : A -> List A -> List A data [List] {A1 A2 : Set} ([A] : [Set] A1 A2) : [Set] (List A1) (List A2) where [nil] : [List] [A] nil nil [cons] : ([A] [->] [List] [A] [->] [List] [A]) cons cons

## More

Make sure to check out the examples provided in the attachment (Attach:LFT.agda). Theory is detailed in the paper: http://publications.lib.chalmers.se/cpl/record/index.xsql?pubid=118913