refactor(library/cast): use .lean file instead of .cpp file to define casting library
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
d5dc5cb576
commit
00e89190c2
21 changed files with 96 additions and 143 deletions
|
@ -195,8 +195,6 @@ add_subdirectory(library)
|
||||||
set(LEAN_LIBS ${LEAN_LIBS} library)
|
set(LEAN_LIBS ${LEAN_LIBS} library)
|
||||||
add_subdirectory(library/arith)
|
add_subdirectory(library/arith)
|
||||||
set(LEAN_LIBS ${LEAN_LIBS} arithlib)
|
set(LEAN_LIBS ${LEAN_LIBS} arithlib)
|
||||||
add_subdirectory(library/cast)
|
|
||||||
set(LEAN_LIBS ${LEAN_LIBS} castlib)
|
|
||||||
add_subdirectory(library/all)
|
add_subdirectory(library/all)
|
||||||
set(LEAN_LIBS ${LEAN_LIBS} alllib)
|
set(LEAN_LIBS ${LEAN_LIBS} alllib)
|
||||||
add_subdirectory(library/rewriter)
|
add_subdirectory(library/rewriter)
|
||||||
|
|
35
src/extra/cast.lean
Normal file
35
src/extra/cast.lean
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
(*
|
||||||
|
"Type casting" library.
|
||||||
|
*)
|
||||||
|
|
||||||
|
(*
|
||||||
|
The cast operator allows us to cast an element of type A
|
||||||
|
into B if we provide a proof that types A and B are equal.
|
||||||
|
*)
|
||||||
|
Variable cast {A B : (Type U)} : A == B → A → B.
|
||||||
|
(*
|
||||||
|
The CastEq axiom states that for any cast of x is equal to x.
|
||||||
|
*)
|
||||||
|
Axiom CastEq {A B : (Type U)} (H : A == B) (x : A) : x == cast H x.
|
||||||
|
|
||||||
|
(*
|
||||||
|
The CastApp axiom "propagates" the cast over application
|
||||||
|
*)
|
||||||
|
Axiom CastApp {A A' : (Type U)} {B : A → (Type U)} {B' : A' → (Type U)}
|
||||||
|
(H1 : (Π x : A, B x) == (Π x : A', B' x)) (H2 : A == A')
|
||||||
|
(f : Π x : A, B x) (x : A) :
|
||||||
|
cast H1 f (cast H2 x) == f x.
|
||||||
|
|
||||||
|
(*
|
||||||
|
If two (dependent) function spaces are equal, then their domains are equal.
|
||||||
|
*)
|
||||||
|
Axiom DomInj {A A' : (Type U)} {B : A → (Type U)} {B' : A' → (Type U)}
|
||||||
|
(H : (Π x : A, B x) == (Π x : A', B' x)) :
|
||||||
|
A == A'.
|
||||||
|
|
||||||
|
(*
|
||||||
|
If two (dependent) function spaces are equal, then their ranges are equal.
|
||||||
|
*)
|
||||||
|
Axiom RanInj {A A' : (Type U)} {B : A → (Type U)} {B' : A' → (Type U)}
|
||||||
|
(H : (Π x : A, B x) == (Π x : A', B' x)) (a : A) :
|
||||||
|
B a == B' (cast (DomInj H) a).
|
|
@ -7,7 +7,6 @@ Author: Leonardo de Moura
|
||||||
#include "kernel/builtin.h"
|
#include "kernel/builtin.h"
|
||||||
#include "library/basic_thms.h"
|
#include "library/basic_thms.h"
|
||||||
#include "library/arith/arith.h"
|
#include "library/arith/arith.h"
|
||||||
#include "library/cast/cast.h"
|
|
||||||
#include "frontends/lean/frontend.h"
|
#include "frontends/lean/frontend.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
|
@ -95,12 +94,6 @@ void init_builtin_notation(environment const & env, io_state & ios) {
|
||||||
mark_implicit_arguments(env, mk_hsymm_fn(), 4);
|
mark_implicit_arguments(env, mk_hsymm_fn(), 4);
|
||||||
mark_implicit_arguments(env, mk_htrans_fn(), 6);
|
mark_implicit_arguments(env, mk_htrans_fn(), 6);
|
||||||
|
|
||||||
mark_implicit_arguments(env, mk_cast_fn(), 2);
|
|
||||||
mark_implicit_arguments(env, mk_cast_eq_fn(), 2);
|
|
||||||
mark_implicit_arguments(env, mk_cast_app_fn(), 4);
|
|
||||||
mark_implicit_arguments(env, mk_dom_inj_fn(), 4);
|
|
||||||
mark_implicit_arguments(env, mk_ran_inj_fn(), 4);
|
|
||||||
|
|
||||||
// implicit arguments for basic theorems
|
// implicit arguments for basic theorems
|
||||||
mark_implicit_arguments(env, mk_absurd_fn(), 1);
|
mark_implicit_arguments(env, mk_absurd_fn(), 1);
|
||||||
mark_implicit_arguments(env, mk_double_neg_elim_fn(), 1);
|
mark_implicit_arguments(env, mk_double_neg_elim_fn(), 1);
|
||||||
|
|
|
@ -7,14 +7,12 @@ Author: Leonardo de Moura
|
||||||
#include "kernel/builtin.h"
|
#include "kernel/builtin.h"
|
||||||
#include "library/basic_thms.h"
|
#include "library/basic_thms.h"
|
||||||
#include "library/arith/arith.h"
|
#include "library/arith/arith.h"
|
||||||
#include "library/cast/cast.h"
|
|
||||||
#include "library/all/all.h"
|
#include "library/all/all.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
void import_all(environment const & env) {
|
void import_all(environment const & env) {
|
||||||
import_basic(env);
|
import_basic(env);
|
||||||
import_basic_thms(env);
|
import_basic_thms(env);
|
||||||
import_cast(env);
|
|
||||||
import_arith(env);
|
import_arith(env);
|
||||||
}
|
}
|
||||||
environment mk_toplevel() {
|
environment mk_toplevel() {
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
add_library(castlib cast.cpp)
|
|
||||||
target_link_libraries(castlib ${LEAN_LIBS})
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
|
||||||
Released under Apache 2.0 license as described in the file LICENSE.
|
|
||||||
|
|
||||||
Author: Leonardo de Moura
|
|
||||||
*/
|
|
||||||
#include "kernel/environment.h"
|
|
||||||
#include "kernel/abstract.h"
|
|
||||||
#include "kernel/builtin.h"
|
|
||||||
#include "kernel/instantiate.h"
|
|
||||||
#include "library/basic_thms.h"
|
|
||||||
#include "library/cast/cast.h"
|
|
||||||
|
|
||||||
namespace lean {
|
|
||||||
// Cast builtin operator
|
|
||||||
MK_CONSTANT(cast_fn, name("cast"));
|
|
||||||
MK_CONSTANT(cast_eq_fn, name("CastEq"));
|
|
||||||
MK_CONSTANT(cast_app_fn, name("CastApp"));
|
|
||||||
MK_CONSTANT(dom_inj_fn, name("DomInj"));
|
|
||||||
MK_CONSTANT(ran_inj_fn, name("RanInj"));
|
|
||||||
|
|
||||||
void import_cast(environment const & env) {
|
|
||||||
if (!env->mark_builtin_imported("cast"))
|
|
||||||
return;
|
|
||||||
expr x = Const("x");
|
|
||||||
expr A = Const("A");
|
|
||||||
expr Ap = Const("A'");
|
|
||||||
expr B = Const("B");
|
|
||||||
expr Bp = Const("B'");
|
|
||||||
expr piABx = Pi({x, A}, B(x));
|
|
||||||
expr piApBpx = Pi({x, Ap}, Bp(x));
|
|
||||||
expr H = Const("H");
|
|
||||||
expr H1 = Const("H1");
|
|
||||||
expr H2 = Const("H2");
|
|
||||||
expr a = Const("a");
|
|
||||||
expr b = Const("b");
|
|
||||||
expr f = Const("f");
|
|
||||||
|
|
||||||
env->add_var(cast_fn_name, Pi({{A, TypeU}, {B, TypeU}}, Eq(A, B) >> (A >> B)));
|
|
||||||
|
|
||||||
// DomInj : Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H : (Pi x : A, B x) = (Pi x : A', B' x)), A = A'
|
|
||||||
env->add_axiom(dom_inj_fn_name, Pi({{A, TypeU}, {Ap, TypeU}, {B, A >> TypeU}, {Bp, Ap >> TypeU}, {H, Eq(piABx, piApBpx)}}, Eq(A, Ap)));
|
|
||||||
|
|
||||||
// RanInj : Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H : (Pi x : A, B x) = (Pi x : A', B' x)) (a : A),
|
|
||||||
// B a = B' (cast A A' (DomInj A A' B B' H) a)
|
|
||||||
env->add_axiom(ran_inj_fn_name, Pi({{A, TypeU}, {Ap, TypeU}, {B, A >> TypeU}, {Bp, Ap >> TypeU}, {H, Eq(piABx, piApBpx)}, {a, A}},
|
|
||||||
Eq(B(a), Bp(Cast(A, Ap, DomInj(A, Ap, B, Bp, H), a)))));
|
|
||||||
|
|
||||||
// CastEq : Pi (A B : Type u) (H : A == B) (x : A), x == (cast A B H x)
|
|
||||||
env->add_axiom(cast_eq_fn_name, Pi({{A, TypeU}, {B, TypeU}, {H, Eq(A, B)}, {x, A}}, Eq(x, Cast(A, B, H, x))));
|
|
||||||
|
|
||||||
// CastApp : Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H1 : (Pi x : A, B x) = (Pi x : A', B' x)) (H2 : A = A')
|
|
||||||
// (f : Pi x : A, B x) (x : A), Cast(Pi(x : A, B x), Pi(x : A', B' x), H1, f)(Cast(A, A', H2, x)) == f(x)
|
|
||||||
env->add_axiom(cast_app_fn_name, Pi({{A, TypeU},
|
|
||||||
{Ap, TypeU}, {B, A >> TypeU}, {Bp, Ap >> TypeU}, {H1, Eq(piABx, piApBpx)}, {H2, Eq(A, Ap)}, {f, piABx}, {x, A}},
|
|
||||||
Eq(Cast(piABx, piApBpx, H1, f)(Cast(A, Ap, H2, x)), f(x))));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
|
||||||
Released under Apache 2.0 license as described in the file LICENSE.
|
|
||||||
|
|
||||||
Author: Leonardo de Moura
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
#include "kernel/expr.h"
|
|
||||||
|
|
||||||
namespace lean {
|
|
||||||
/** \brief Type Cast. It has type <tt>Pi (A : Type u) (B : Type u) (H : A = B) (a : A), B</tt> */
|
|
||||||
expr mk_cast_fn();
|
|
||||||
/** \brief Return the term (cast A B H a) */
|
|
||||||
inline expr mk_cast(expr const & A, expr const & B, expr const & H, expr const & a) { return mk_app(mk_cast_fn(), A, B, H, a); }
|
|
||||||
inline expr Cast(expr const & A, expr const & B, expr const & H, expr const & a) { return mk_cast(A, B, H, a); }
|
|
||||||
|
|
||||||
/** \brief Axiom a == (cast A B H a) */
|
|
||||||
expr mk_cast_eq_fn();
|
|
||||||
inline expr CastEq(expr const & A, expr const & B, expr const & H, expr const & a) { return mk_app({mk_cast_eq_fn(), A, B, H, a}); }
|
|
||||||
|
|
||||||
/** \brief Axiom
|
|
||||||
CastApp :
|
|
||||||
Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H1 : (Pi x : A, B x) = (Pi x : A', B' x)) (H2 : A = A')
|
|
||||||
(f : Pi x : A, B x) (x : A), Cast(Pi(x : A, B x), Pi(x : A', B' x), H1, f)(Cast(A, A', H2, x)) == f(x)
|
|
||||||
*/
|
|
||||||
expr mk_cast_app_fn();
|
|
||||||
inline expr CastApp(expr const & A, expr const & Ap, expr const & B, expr const & Bp, expr const & H1, expr const & H2,
|
|
||||||
expr const & f, expr const & x) {
|
|
||||||
return mk_app({mk_cast_app_fn(), A, Ap, B, Bp, H1, H2, f, x});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Domain Injectivity.
|
|
||||||
It has type <tt>Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H : (Pi x : A, B x) = (Pi x : A', B' x)), A = A' </tt>
|
|
||||||
*/
|
|
||||||
expr mk_dom_inj_fn();
|
|
||||||
/** \brief Return the term (DomInj A A' B B' H) */
|
|
||||||
inline expr mk_dom_inj(expr const & A, expr const & Ap, expr const & B, expr const & Bp, expr const & H) {
|
|
||||||
return mk_app({mk_dom_inj_fn(), A, Ap, B, Bp, H});
|
|
||||||
}
|
|
||||||
inline expr DomInj(expr const & A, expr const & Ap, expr const & B, expr const & Bp, expr const & H) {
|
|
||||||
return mk_dom_inj(A, Ap, B, Bp, H);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Range Injectivity.
|
|
||||||
It has type <tt>Pi (A A': Type u) (B : A -> Type u) (B' : A' -> Type u) (H : (Pi x : A, B x) = (Pi x : A', B' x)) (a : A),
|
|
||||||
B a = B' (cast A A' (DomInj A A' B B' H) a)</tt>
|
|
||||||
*/
|
|
||||||
expr mk_ran_inj_fn();
|
|
||||||
/** \brief Return the term (RanInj A A' B B' H) */
|
|
||||||
inline expr mk_ran_inj(expr const & A, expr const & Ap, expr const & B, expr const & Bp, expr const & H, expr const & a) {
|
|
||||||
return mk_app({mk_ran_inj_fn(), A, Ap, B, Bp, H, a});
|
|
||||||
}
|
|
||||||
inline expr RanInj(expr const & A, expr const & Ap, expr const & B, expr const & Bp, expr const & H, expr const & a) {
|
|
||||||
return mk_ran_inj(A, Ap, B, Bp, H, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class environment;
|
|
||||||
/** \brief Import type "casting" library */
|
|
||||||
void import_cast(environment const & env);
|
|
||||||
}
|
|
|
@ -4,15 +4,23 @@ add_executable(lean lean.cpp)
|
||||||
add_dependencies(lean githash)
|
add_dependencies(lean githash)
|
||||||
target_link_libraries(lean ${EXTRA_LIBS})
|
target_link_libraries(lean ${EXTRA_LIBS})
|
||||||
|
|
||||||
|
function(add_extra_dependency indir file)
|
||||||
|
get_filename_component(FNAME ${file} NAME)
|
||||||
|
add_custom_command(OUTPUT ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy ${file} ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME}
|
||||||
|
MAIN_DEPENDENCY ${file})
|
||||||
|
add_custom_target("${FNAME}_extra" DEPENDS ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME})
|
||||||
|
add_dependencies(lean "${FNAME}_extra")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(add_extra_module indir)
|
function(add_extra_module indir)
|
||||||
file(GLOB EXTRA_LUA_FILES "${LEAN_SOURCE_DIR}/extra/${indir}/*.lua")
|
file(GLOB EXTRA_LUA_FILES "${LEAN_SOURCE_DIR}/extra/${indir}/*.lua")
|
||||||
foreach(FILE ${EXTRA_LUA_FILES})
|
foreach(FILE ${EXTRA_LUA_FILES})
|
||||||
get_filename_component(FNAME ${FILE} NAME)
|
add_extra_dependency(${indir} ${FILE})
|
||||||
add_custom_command(OUTPUT ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME}
|
endforeach(FILE)
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${FILE} ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME}
|
file(GLOB EXTRA_LEAN_FILES "${LEAN_SOURCE_DIR}/extra/${indir}/*.lean")
|
||||||
MAIN_DEPENDENCY ${FILE})
|
foreach(FILE ${EXTRA_LEAN_FILES})
|
||||||
add_custom_target("${FNAME}_extra" DEPENDS ${LEAN_BINARY_DIR}/shell/${indir}/${FNAME})
|
add_extra_dependency(${indir} ${FILE})
|
||||||
add_dependencies(lean "${FNAME}_extra")
|
|
||||||
endforeach(FILE)
|
endforeach(FILE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
Import "cast.lean"
|
||||||
|
|
||||||
Variable vector : Type -> Nat -> Type
|
Variable vector : Type -> Nat -> Type
|
||||||
Axiom N0 (n : Nat) : n + 0 = n
|
Axiom N0 (n : Nat) : n + 0 = n
|
||||||
Theorem V0 (T : Type) (n : Nat) : (vector T (n + 0)) = (vector T n) :=
|
Theorem V0 (T : Type) (n : Nat) : (vector T (n + 0)) = (vector T n) :=
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Assumed: vector
|
Assumed: vector
|
||||||
Assumed: N0
|
Assumed: N0
|
||||||
Proved: V0
|
Proved: V0
|
||||||
Assumed: f
|
Assumed: f
|
||||||
Assumed: m
|
Assumed: m
|
||||||
Assumed: v1
|
Assumed: v1
|
||||||
Error (line: 12, pos: 6) type mismatch at application
|
Error (line: 14, pos: 6) type mismatch at application
|
||||||
f m v1
|
f m v1
|
||||||
Function type:
|
Function type:
|
||||||
Π (n : ℕ), vector ℤ n → ℤ
|
Π (n : ℕ), vector ℤ n → ℤ
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
Import "cast.lean"
|
||||||
Variable A : Type
|
Variable A : Type
|
||||||
Variable B : Type
|
Variable B : Type
|
||||||
Variable A' : Type
|
Variable A' : Type
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Assumed: A
|
Assumed: A
|
||||||
Assumed: B
|
Assumed: B
|
||||||
Assumed: A'
|
Assumed: A'
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
Import "cast.lean"
|
||||||
|
|
||||||
Variables A A' B B' : Type
|
Variables A A' B B' : Type
|
||||||
Variable x : A
|
Variable x : A
|
||||||
Eval cast (Refl A) x
|
Eval cast (Refl A) x
|
||||||
|
@ -20,4 +22,3 @@ Axiom Hb : A2 = A3
|
||||||
Variable a : A1
|
Variable a : A1
|
||||||
Eval (cast Hb (cast Ha a))
|
Eval (cast Hb (cast Ha a))
|
||||||
Check (cast Hb (cast Ha a))
|
Check (cast Hb (cast Ha a))
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Assumed: A
|
Assumed: A
|
||||||
Assumed: A'
|
Assumed: A'
|
||||||
Assumed: B
|
Assumed: B
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
Import "cast.lean"
|
||||||
SetOption pp::colors false
|
SetOption pp::colors false
|
||||||
|
|
||||||
Definition TypeM := (Type M)
|
Definition TypeM := (Type M)
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Defined: TypeM
|
Defined: TypeM
|
||||||
Defined: TypeU
|
Defined: TypeU
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
Importing file 'simple.lean'
|
Importing file './simple.lean'
|
||||||
Assumed: x
|
Assumed: x
|
||||||
Assumed: y
|
Assumed: y
|
||||||
Module 'simple.lean' has already been imported
|
Importing file './simple.lean'
|
||||||
Importing file 'simple.lean'
|
|
||||||
Assumed: x
|
Assumed: x
|
||||||
Assumed: y
|
Assumed: y
|
||||||
Module 'simple.lean' has already been imported
|
|
||||||
x + y : ℤ
|
x + y : ℤ
|
||||||
Assumed: z
|
Assumed: z
|
||||||
z : ℤ
|
z : ℤ
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
Import "cast.lean"
|
||||||
SetOption pp::colors false
|
SetOption pp::colors false
|
||||||
|
|
||||||
Definition TypeM := (Type M)
|
Definition TypeM := (Type M)
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Defined: TypeM
|
Defined: TypeM
|
||||||
Defined: TypeU
|
Defined: TypeU
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
Import "cast.lean"
|
||||||
SetOption pp::colors false
|
SetOption pp::colors false
|
||||||
|
|
||||||
Definition TypeM := (Type M)
|
Definition TypeM := (Type M)
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Set: pp::unicode
|
Set: pp::unicode
|
||||||
|
Importing file '/home/leo/projects/lean/build/debug/shell/cast.lean'
|
||||||
|
Assumed: cast
|
||||||
|
Assumed: CastEq
|
||||||
|
Assumed: CastApp
|
||||||
|
Assumed: DomInj
|
||||||
|
Assumed: RanInj
|
||||||
Set: pp::colors
|
Set: pp::colors
|
||||||
Defined: TypeM
|
Defined: TypeM
|
||||||
Defined: TypeU
|
Defined: TypeU
|
||||||
|
|
Loading…
Reference in a new issue