__ in Ocaml extracted from Coq -
ocaml code extracted coq includes (in cases) type __
, function __
defined follows:
type __ = obj.t let __ = let rec f _ = obj.repr f in obj.repr f
the documentation says in past, such type defined unit
(and __
taken ()
) there exist (rare) cases value of type __
applied value of type __
.
__
uses undocumented functions of obj
module ocaml, seems defined totally polymorphic function eats arguments (whatever number).
is there documentation regarding cases __
cannot eliminated , values of type applied values of same type, both theoretical (construct coq terms elimination impossible) , practical (show realistic case occurs) point of view?
the references cited in readme give nice overview of erasure problem. specifically, both this report , this article exaplain in detail how type schemes , logical parts of cic terms erased, , why 1 must have __ x = __
. problem not __
may applied itself, may applied anything @ all.
unfortunately, not @ clear if having behavior important in non-pathological case. motivation given there able extract any coq term, , documents not mention cases interesting practical standpoint. example given on 3 one:
definition foo (x : type) (f : nat -> x) (g : x -> nat) := g (f 0). definition bar := foo true (fun _ => i).
executing recursive extraction bar.
gives following result:
type __ = obj.t let __ = let rec f _ = obj.repr f in obj.repr f type nat = | o | s of nat (** val foo : (nat -> 'a1) -> ('a1 -> nat) -> nat **) let foo f g = g (f o) (** val bar : (__ -> nat) -> nat **) let bar = foo (obj.magic __)
since foo
polymorphic on type
, there no way of simplifying f o
application on body, because have computational content. however, since prop
subtype of type
, foo
can applied true
, happens in bar
. when try reduce bar
, thus, have __
being applied o
.
this particular case not interesting, because possible inline foo
:
let bar g = g __
since true
can't applied anything, if g
corresponds legal coq term, __
argument wouldn't applied anything, , therefore safe have __ = ()
(i believe). however, there cases not possible know in advance whether erased term can further applied or not, makes general definition __
necessary. check out instance fun
example here, near end of file.
Comments
Post a Comment