2 (:refer-clojure :exclude [==])
3 (:use [clojure.core.logic :exclude [is] :as l]))
6 (defn reifier-for [tag x]
8 (let [x (walk* r (walk* a x))]
11 (defn symbolo [x] (predc x symbol? (reifier-for 'sym x)))
14 ;;; type := var | [:=> type type]
15 ;;; exp := name | (fn [name] exp) | (exp exp)
17 ;;; env := () | ([name type] . env)
18 (defn env-lookupo [env x tx]
19 (fresh [y ty env-rest]
20 (conso [y ty] env-rest env)
23 ((!= x y) (env-lookupo env-rest x tx)))))
27 ((symbolo e) (env-lookupo env e t))
28 ((fresh [x body tx tbody envx]
29 (== e `(~'fn [~x] ~body))
30 (conso [x tx] env envx)
32 (tio envx body tbody)))
33 ((fresh [e1 e2 t1 t11 t12 t2]