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


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 ( 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.


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


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


Make sure to check out the examples provided in the attachment (Attach:LFT.agda). Theory is detailed in the paper:

Page last modified on August 07, 2015, at 07:05 PM
Powered by PmWiki