module Duality (X : Set) (_~_ : (x0 x1 : X) -> Set) (sym : {x0 x1 : X} -> x0 ~ x1 -> x1 ~ x0) where Object : Set1 Object = X -> Set Dual : Object -> Object Dual A x0 = {x1 : X} -> A x1 -> x0 ~ x1 _<=_ : Object -> Object -> Set A0 <= A1 = {x : X} -> A0 x -> A1 x contra : {A0 A1 : Object} -> A0 <= A1 -> Dual A1 <= Dual A0 contra i f x = f (i x) inject : {A : Object} -> A <= Dual (Dual A) inject x f = sym (f x) cancel : {A : Object} -> Dual (Dual (Dual A)) <= Dual A cancel = contra inject