List.fold_left (fun status sort -> elim sort status) status
[ Cic.Prop; Cic.Set; (Cic.Type (CicUniv.fresh ())) ]
-let generate_projections uri status =
- let projections = CicRecord.projections_of uri in
+let generate_projections uri fields status =
+ let projections = CicRecord.projections_of uri fields in
List.fold_left
(fun status (uri, name, bo) ->
try
let status = MatitaSync.add_obj uri obj status in
match obj with
Cic.Constant _ -> status
- | Cic.InductiveDefinition (_,_,_,attrs)
- when List.mem (`Class `Record) attrs ->
+ | Cic.InductiveDefinition (_,_,_,attrs) ->
let status = generate_elimination_principles uri status in
- generate_projections uri status
- | Cic.InductiveDefinition (_,_,_,_) ->
- generate_elimination_principles uri status
+ let rec get_record_attrs =
+ function
+ [] -> None
+ | (`Class (`Record fields))::_ -> Some fields
+ | _::tl -> get_record_attrs tl
+ in
+ (match get_record_attrs attrs with
+ None -> status (* not a record *)
+ | Some fields -> generate_projections uri fields status)
| Cic.CurrentProof _
| Cic.Variable _ -> assert false