1 (* need this or the Haskell extraction fails *)
2 Set Printing Width 1300000.
4 Require Import Coq.Lists.List.
5 Require Import Coq.Strings.Ascii.
6 Require Import Coq.Strings.String.
8 Require Import Preamble.
9 Require Import General.
11 Require Import NaturalDeduction.
12 Require Import NaturalDeductionToLatex.
14 Require Import HaskKinds.
15 Require Import HaskCoreLiterals.
16 Require Import HaskCoreVars.
17 Require Import HaskCoreTypes.
18 Require Import HaskCore.
19 Require Import HaskWeakVars.
20 Require Import HaskWeakTypes.
21 Require Import HaskWeak.
22 Require Import HaskStrongTypes.
23 Require Import HaskStrong.
24 Require Import HaskProof.
25 Require Import HaskCoreToWeak.
26 Require Import HaskWeakToStrong.
27 Require Import HaskStrongToProof.
28 Require Import HaskProofToStrong.
29 Require Import HaskProofToLatex.
30 Require Import HaskStrongToWeak.
31 Require Import HaskWeakToCore.
33 Open Scope string_scope.
34 Extraction Language Haskell.
36 (* I try to reuse Haskell types mostly to get the "deriving Show" aspect *)
37 Extract Inductive option => "Prelude.Maybe" [ "Prelude.Just" "Prelude.Nothing" ].
38 Extract Inductive list => "([])" [ "([])" "(:)" ].
39 (*Extract Inductive vec => "([])" [ "([])" "(:)" ].*)
40 (*Extract Inductive Tree => "([])" [ "([])" "(:)" ].*)
41 Extract Inlined Constant map => "Prelude.map".
42 Extract Inductive string => "Prelude.String" [ "([])" "(:)" ].
43 Extract Inductive prod => "(,)" [ "(,)" ].
44 Extract Inductive sum => "Prelude.Either" [ "Prelude.Left" "Prelude.Right" ].
45 Extract Inductive sumbool => "Prelude.Bool" [ "Prelude.True" "Prelude.False" ].
46 Extract Inductive bool => "Prelude.Bool" [ "Prelude.True" "Prelude.False" ].
47 Extract Inductive unit => "()" [ "()" ].
48 Extract Inlined Constant string_dec => "(==)".
49 Extract Inlined Constant ascii_dec => "(==)".
50 Extract Inductive string => "Prelude.String" [ "[]" "(:)" ].
52 (* adapted from ExtrOcamlString.v *)
53 Extract Inductive ascii => "Prelude.Char" [ "bin2ascii" ] "bin2ascii'".
54 Extract Constant zero => "'\000'".
55 Extract Constant one => "'\001'".
56 Extract Constant shift => "shiftAscii".
58 Unset Extraction Optimize.
59 Unset Extraction AutoInline.
61 Variable Prelude_error : forall {A}, string -> A. Extract Inlined Constant Prelude_error => "Prelude.error".
64 Context (ce:@CoreExpr CoreVar).
66 Definition Γ : TypeEnv := nil.
68 Definition Δ : CoercionEnv Γ := nil.
70 Definition φ : TyVarResolver Γ :=
71 fun cv => (fun TV env => Prelude_error "unbound tyvar").
72 (*fun tv => error ("tried to get the representative of an unbound tyvar:" +++ (getCoreVarOccString tv)).*)
74 Definition ψ : CoreVar->HaskCoVar nil Δ
75 := fun cv => Prelude_error ("tried to get the representative of an unbound covar!" (*+++ (getTypeVarOccString cv)*)).
77 (* We need to be able to resolve unbound exprvars, but we can be sure their types will have no
78 * free tyvars in them *)
79 Definition ξ (cv:CoreVar) : LeveledHaskType Γ ★ :=
80 match coreVarToWeakVar cv with
81 | WExprVar wev => match weakTypeToType'' φ wev ★ with
82 | Error s => Prelude_error ("Error in top-level xi: " +++ s)
85 | WTypeVar _ => Prelude_error "top-level xi got a type variable"
86 | WCoerVar _ => Prelude_error "top-level xi got a coercion variable"
89 Definition header : string :=
90 "\documentclass[9pt]{article}"+++eol+++
91 "\usepackage{amsmath}"+++eol+++
92 "\usepackage{amssymb}"+++eol+++
93 "\usepackage{proof}"+++eol+++
94 "\usepackage{mathpartir}"+++eol+++
95 "\usepackage{trfrac}"+++eol+++
96 "\def\code#1#2{\Box_{#1} #2}"+++eol+++
97 "\usepackage[paperwidth=20in,centering]{geometry}"+++eol+++
98 "\usepackage[displaymath,tightpage,active]{preview}"+++eol+++
99 "\begin{document}"+++eol+++
100 "\begin{preview}"+++eol.
102 Definition footer : string :=
103 eol+++"\end{preview}"+++
104 eol+++"\end{document}"+++
107 Definition handleExpr (ce:@CoreExpr CoreVar) : string :=
108 match coreExprToWeakExpr ce with
109 | Error s => Prelude_error ("unable to convert GHC Core expression into Coq HaskWeak expression due to:\n "+++s)
110 | OK we => match weakTypeOfWeakExpr we >>= fun t => weakTypeToType φ t with
111 | Error s => Prelude_error ("unable to calculate HaskType of a HaskWeak expression because: " +++ s)
112 | OK τ => match τ with
113 | haskTypeOfSomeKind ★ τ' =>
114 match weakExprToStrongExpr Γ Δ φ ψ ξ τ' nil (*(makeClosedExpression*) we (* ) *) with
115 | Error s => Prelude_error ("unable to convert HaskWeak to HaskStrong due to:\n "+++s)
116 | OK e' => eol+++"$$"+++ nd_ml_toLatex (@expr2proof _ _ _ _ _ _ e')+++"$$"+++eol
118 | haskTypeOfSomeKind κ τ' =>
119 Prelude_error ("encountered 'expression' of kind "+++κ+++" at top level (type "+++τ'
120 +++"); shouldn't happen")
125 Definition handleBind (bind:@CoreBind CoreVar) : string :=
127 | CoreNonRec _ e => handleExpr e
128 | CoreRec lbe => fold_left (fun x y => x+++eol+++eol+++y) (map (fun x => handleExpr (snd x)) lbe) ""
131 Definition coqPassCoreToString (lbinds:list (@CoreBind CoreVar)) : string :=
133 (fold_left (fun x y => x+++eol+++eol+++y) (map handleBind lbinds) "")
136 Definition coqPassCoreToCore (lbinds:list (@CoreBind CoreVar)) : list (@CoreBind CoreVar) :=
141 Extraction "Extraction.hs" coqPassCoreToString coqPassCoreToCore.