Skip to content

Commit e9b20e6

Browse files
authored
Merge pull request #1275 from GaloisInc/issue1166
cryptol-saw-core: Fix tuple encoding used by `proveEq`.
2 parents b637dd8 + 1ffea32 commit e9b20e6

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

cryptol-saw-core/src/Verifier/SAW/Cryptol.hs

+22-15
Original file line numberDiff line numberDiff line change
@@ -1408,27 +1408,34 @@ proveEq sc env t1 t2
14081408
aEq <- proveEq sc env a1 a2
14091409
bEq <- proveEq sc env b1 b2
14101410
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]
14261423
(C.tIsRec -> Just tm1, C.tIsRec -> Just tm2)
14271424
| map fst (C.canonicalFields tm1) == map fst (C.canonicalFields tm2) ->
14281425
proveEq sc env (C.tTuple (map snd (C.canonicalFields tm1))) (C.tTuple (map snd (C.canonicalFields tm2)))
14291426
(_, _) ->
14301427
panic "proveEq" ["Internal type error:", pretty t1, pretty t2]
14311428

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+
14321439
--------------------------------------------------------------------------------
14331440
-- List comprehensions
14341441

0 commit comments

Comments
 (0)