- | (C.Const (uri1,_), C.Const (uri2,_)) ->
- (*CSC: questo commento e' chiaro o delirante? Io lo sto scrivendo *)
- (*CSC: mentre sono delirante, quindi ... *)
- (* WARNING: it is really important that the two cookingsno are not*)
- (* checked for equality. This allows not to cook an object with no*)
- (* ingredients only to update the cookingsno. E.g: if a term t has*)
- (* a reference to a term t1 which does not depend on any variable *)
- (* and t1 depends on a term t2 (that can't depend on any variable *)
- (* because of t1), then t1 cooked at every level could be the same*)
- (* as t1 cooked at level 0. Doing so, t2 will be extended in t *)
- (* with cookingsno 0 and not 2. But this will not cause any *)
- (* trouble if here we don't check that the two cookingsno are *)
- (* equal. *)
- U.eq uri1 uri2
- | (C.MutInd (uri1,k1,i1), C.MutInd (uri2,k2,i2)) ->
- (* WARNIG: see the previous warning *)
- U.eq uri1 uri2 && i1 = i2
- | (C.MutConstruct (uri1,_,i1,j1), C.MutConstruct (uri2,_,i2,j2)) ->
- (* WARNIG: see the previous warning *)
- U.eq uri1 uri2 && i1 = i2 && j1 = j2
- | (C.MutCase (uri1,_,i1,outtype1,term1,pl1),
- C.MutCase (uri2,_,i2,outtype2,term2,pl2)) ->
- (* WARNIG: see the previous warning *)
- (* aux context outtype1 outtype2 should be true if *)
- (* aux context pl1 pl2 *)
- U.eq uri1 uri2 && i1 = i2 && aux context outtype1 outtype2 &&
- aux context term1 term2 &&
- List.fold_right2 (fun x y b -> b && aux context x y) pl1 pl2 true
+ | (C.Const (uri1,exp_named_subst1), C.Const (uri2,exp_named_subst2)) ->
+ U.eq uri1 uri2 &&
+ (try
+ List.fold_right2
+ (fun (uri1,x) (uri2,y) b ->
+ U.eq uri1 uri2 && aux test_equality_only context x y && b
+ ) exp_named_subst1 exp_named_subst2 true
+ with
+ Invalid_argument _ -> false
+ )
+ | (C.MutInd (uri1,i1,exp_named_subst1),
+ C.MutInd (uri2,i2,exp_named_subst2)
+ ) ->
+ U.eq uri1 uri2 && i1 = i2 &&
+ (try
+ List.fold_right2
+ (fun (uri1,x) (uri2,y) b ->
+ U.eq uri1 uri2 && aux test_equality_only context x y && b
+ ) exp_named_subst1 exp_named_subst2 true
+ with
+ Invalid_argument _ -> false
+ )
+ | (C.MutConstruct (uri1,i1,j1,exp_named_subst1),
+ C.MutConstruct (uri2,i2,j2,exp_named_subst2)
+ ) ->
+ U.eq uri1 uri2 && i1 = i2 && j1 = j2 &&
+ (try
+ List.fold_right2
+ (fun (uri1,x) (uri2,y) b ->
+ U.eq uri1 uri2 && aux test_equality_only context x y && b
+ ) exp_named_subst1 exp_named_subst2 true
+ with
+ Invalid_argument _ -> false
+ )
+ | (C.MutCase (uri1,i1,outtype1,term1,pl1),
+ C.MutCase (uri2,i2,outtype2,term2,pl2)) ->
+ U.eq uri1 uri2 && i1 = i2 &&
+ aux test_equality_only context outtype1 outtype2 &&
+ aux test_equality_only context term1 term2 &&
+ List.fold_right2
+ (fun x y b -> b && aux test_equality_only context x y)
+ pl1 pl2 true