@@ -1408,27 +1408,34 @@ proveEq sc env t1 t2
1408
1408
aEq <- proveEq sc env a1 a2
1409
1409
bEq <- proveEq sc env b1 b2
1410
1410
scGlobalApply sc " Cryptol.fun_cong" [a1', a2', b1', b2', aEq, bEq]
1411
- (C. tIsTuple -> Just (a1 : ts1), C. tIsTuple -> Just (a2 : ts2))
1412
- | length ts1 == length ts2 ->
1413
- do let b1 = C. tTuple ts1
1414
- b2 = C. tTuple ts2
1415
- a1' <- importType sc env a1
1416
- a2' <- importType sc env a2
1417
- b1' <- importType sc env b1
1418
- b2' <- importType sc env b2
1419
- aEq <- proveEq sc env a1 a2
1420
- bEq <- proveEq sc env b1 b2
1421
- if b1 == b2
1422
- then scGlobalApply sc " Cryptol.pair_cong1" [a1', a2', b1', aEq]
1423
- else if a1 == a2
1424
- then scGlobalApply sc " Cryptol.pair_cong2" [a1', b1', b2', bEq]
1425
- else scGlobalApply sc " Cryptol.pair_cong" [a1', a2', b1', b2', aEq, bEq]
1411
+ (tIsPair -> Just (a1, b1), tIsPair -> Just (a2, b2)) ->
1412
+ do a1' <- importType sc env a1
1413
+ a2' <- importType sc env a2
1414
+ b1' <- importType sc env b1
1415
+ b2' <- importType sc env b2
1416
+ aEq <- proveEq sc env a1 a2
1417
+ bEq <- proveEq sc env b1 b2
1418
+ if b1 == b2
1419
+ then scGlobalApply sc " Cryptol.pair_cong1" [a1', a2', b1', aEq]
1420
+ else if a1 == a2
1421
+ then scGlobalApply sc " Cryptol.pair_cong2" [a1', b1', b2', bEq]
1422
+ else scGlobalApply sc " Cryptol.pair_cong" [a1', a2', b1', b2', aEq, bEq]
1426
1423
(C. tIsRec -> Just tm1, C. tIsRec -> Just tm2)
1427
1424
| map fst (C. canonicalFields tm1) == map fst (C. canonicalFields tm2) ->
1428
1425
proveEq sc env (C. tTuple (map snd (C. canonicalFields tm1))) (C. tTuple (map snd (C. canonicalFields tm2)))
1429
1426
(_, _) ->
1430
1427
panic " proveEq" [" Internal type error:" , pretty t1, pretty t2]
1431
1428
1429
+ -- | Deconstruct a cryptol tuple type as a pair according to the
1430
+ -- saw-core tuple type encoding.
1431
+ tIsPair :: C. Type -> Maybe (C. Type , C. Type )
1432
+ tIsPair t =
1433
+ do ts <- C. tIsTuple t
1434
+ case ts of
1435
+ [] -> Nothing
1436
+ [t1, t2] -> Just (t1, t2)
1437
+ t1 : ts' -> Just (t1, C. tTuple ts')
1438
+
1432
1439
--------------------------------------------------------------------------------
1433
1440
-- List comprehensions
1434
1441
0 commit comments