--- /dev/null
+(*********************************************************************************************************************************)
+(* HaskKinds: Definitions shared by all four representations (Core, Weak, Strong, Proof) *)
+(*********************************************************************************************************************************)
+
+Generalizable All Variables.
+Require Import Preamble.
+Require Import General.
+Require Import Coq.Strings.String.
+Open Scope nat_scope.
+
+Variable Note : Type. Extract Inlined Constant Note => "CoreSyn.Note".
+Variable nat2string : nat -> string. Extract Inlined Constant nat2string => "nat2string".
+
+(* Figure 7: production κ, ι *)
+Inductive Kind : Type :=
+ | KindType : Kind (* ★ - the kind of boxed types*)
+ | KindTypeFunction : Kind -> Kind -> Kind (* ⇛ *)
+ | KindUnliftedType : Kind (* not in the paper - this is the kind of unboxed non-tuple types *)
+ | KindUnboxedTuple : Kind (* not in the paper - this is the kind of unboxed tuples *)
+ | KindArgType : Kind (* not in the paper - this is the lub of KindType and KindUnliftedType *)
+ | KindOpenType : Kind (* not in the paper - kind of all types (lifted, boxed, whatever) *).
+
+Notation "'★'" := KindType.
+Notation "a ⇛ b" := (KindTypeFunction a b).
+
+Instance KindEqDecidable : EqDecidable Kind.
+ apply Build_EqDecidable.
+ induction v1.
+ destruct v2; try (right; intro q; inversion q; fail) ; left ; auto.
+ destruct v2; try (right; intro q; inversion q; fail) ; auto.
+ destruct (IHv1_1 v2_1); destruct (IHv1_2 v2_2); subst; auto;
+ right; intro; subst; inversion H; subst; apply n; auto.
+ destruct v2; try (right; intro q; inversion q; fail) ; left ; auto.
+ destruct v2; try (right; intro q; inversion q; fail) ; left ; auto.
+ destruct v2; try (right; intro q; inversion q; fail) ; left ; auto.
+ destruct v2; try (right; intro q; inversion q; fail) ; left ; auto.
+ Defined.
+