Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

Commit 71095a6

Browse files
committed
return list[CTerm]
1 parent 5fa1a71 commit 71095a6

File tree

5 files changed

+24
-15
lines changed

5 files changed

+24
-15
lines changed

src/pyk/__main__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import json
34
import logging
45
import sys
56
from argparse import ArgumentParser, FileType
@@ -99,7 +100,7 @@ def exec_prove(args: Namespace) -> None:
99100
kompiled_dir: Path = args.definition_dir
100101
kprover = KProve(kompiled_dir, args.main_file)
101102
final_state = kprover.prove(Path(args.spec_file), spec_module_name=args.spec_module, args=args.kArgs)
102-
args.output_file.write(final_state.kast.to_json())
103+
args.output_file.write(json.dumps(mlOr([state.kast for state in final_state]).to_dict()))
103104
_LOGGER.info(f'Wrote file: {args.output_file.name}')
104105

105106

src/pyk/ktool/kprove.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from ..kast.inner import KInner
1818
from ..kast.manip import extract_subst, flatten_label, free_vars
1919
from ..kast.outer import KDefinition, KFlatModule, KFlatModuleList, KImport, KRequire
20-
from ..prelude.ml import is_top, mlAnd
20+
from ..prelude.ml import mlAnd
2121
from ..utils import gen_file_timestamp, run_process, unique
2222
from .kprint import KPrint
2323

@@ -197,7 +197,7 @@ def prove(
197197
depth: int | None = None,
198198
haskell_log_format: KoreExecLogFormat = KoreExecLogFormat.ONELINE,
199199
haskell_log_debug_transition: bool = True,
200-
) -> CTerm:
200+
) -> list[CTerm]:
201201
log_file = spec_file.with_suffix('.debug-log') if log_axioms_file is None else log_axioms_file
202202
if log_file.exists():
203203
log_file.unlink()
@@ -245,13 +245,14 @@ def prove(
245245
raise RuntimeError('kprove failed!')
246246

247247
if dry_run:
248-
return CTerm.bottom()
248+
return [CTerm.bottom()]
249249

250250
debug_log = _get_rule_log(log_file)
251-
final_state = CTerm.from_kast(kast_term(json.loads(proc_result.stdout), KInner)) # type: ignore # https://github.com/python/mypy/issues/4717
252-
if final_state.is_top and len(debug_log) == 0 and not allow_zero_step:
251+
as_kast = kast_term(json.loads(proc_result.stdout), KInner) # type: ignore # https://github.com/python/mypy/issues/4717
252+
final_states = [CTerm.from_kast(disjunct) for disjunct in flatten_label('#Or', as_kast)]
253+
if next(state.is_top for state in final_states) and len(debug_log) == 0 and not allow_zero_step:
253254
raise ValueError(f'Proof took zero steps, likely the LHS is invalid: {spec_file}')
254-
return final_state
255+
return final_states
255256

256257
def prove_claim(
257258
self,
@@ -265,7 +266,7 @@ def prove_claim(
265266
allow_zero_step: bool = False,
266267
dry_run: bool = False,
267268
depth: int | None = None,
268-
) -> CTerm:
269+
) -> list[CTerm]:
269270
with self._tmp_claim_definition(claim, claim_id, lemmas=lemmas) as (claim_path, claim_module_name):
270271
return self.prove(
271272
claim_path,
@@ -295,7 +296,7 @@ def prove_cterm(
295296
depth: int | None = None,
296297
) -> list[CTerm]:
297298
claim, var_map = build_claim(claim_id, init_cterm, target_cterm, keep_vars=free_vars(init_cterm.kast))
298-
next_state = self.prove_claim(
299+
next_states_cterm = self.prove_claim(
299300
claim,
300301
claim_id,
301302
lemmas=lemmas,
@@ -305,7 +306,8 @@ def prove_cterm(
305306
allow_zero_step=allow_zero_step,
306307
depth=depth,
307308
)
308-
next_states = list(unique(var_map(ns) for ns in flatten_label('#Or', next_state.kast) if not is_top(ns)))
309+
# next_states = list(unique(var_map(ns) for ns in flatten_label('#Or', next_state.kast) if not is_top(ns)))
310+
next_states = list(unique(var_map(ns.kast) for ns in next_states_cterm if not ns.is_top))
309311
constraint_subst, _ = extract_subst(init_cterm.kast)
310312
next_states_cterm = [
311313
CTerm.from_kast(mlAnd([constraint_subst.unapply(ns), constraint_subst.ml_pred])) for ns in next_states

src/tests/integration/kprove/test_emit_json_spec.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55

66
import pytest
77

8+
from pyk.cterm import CTerm
89
from pyk.kast.kast import EMPTY_ATT
910
from pyk.kast.manip import remove_generated_cells
1011
from pyk.kast.outer import KDefinition, KRequire
1112
from pyk.kast.pretty import paren
13+
from pyk.prelude.ml import mlOr
1214
from pyk.testing import KProveTest
1315

1416
from ..utils import K_FILES
@@ -41,7 +43,7 @@ def test_prove_claim(self, kprove: KProve, spec_module: KFlatModule) -> None:
4143
result = kprove.prove_claim(spec_module.claims[0], 'looping-1')
4244

4345
# Then
44-
assert result.is_top
46+
assert CTerm._is_top(mlOr([res.kast for res in result]))
4547

4648
def test_prove(self, kprove: KProve, spec_module: KFlatModule) -> None:
4749
# Given
@@ -62,4 +64,4 @@ def test_prove(self, kprove: KProve, spec_module: KFlatModule) -> None:
6264
result = kprove.prove(spec_file, spec_module_name=spec_module_name, args=['-I', str(include_dir)])
6365

6466
# Then
65-
assert result.is_top
67+
assert CTerm._is_top(mlOr([res.kast for res in result]))

src/tests/integration/kprove/test_print_prove_rewrite.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
from typing import TYPE_CHECKING
44

5+
from pyk.cterm import CTerm
56
from pyk.kast.inner import KApply, KRewrite, KVariable
67
from pyk.kast.manip import push_down_rewrites
78
from pyk.kast.outer import KClaim
9+
from pyk.prelude.ml import mlOr
810
from pyk.testing import KProveTest
911

1012
from ..utils import K_FILES
@@ -45,4 +47,4 @@ def test_print_prove_rewrite(self, kprove: KProve) -> None:
4547

4648
# Then
4749
assert actual == expected
48-
assert result.is_top
50+
assert CTerm._is_top(mlOr([res.kast for res in result]))

src/tests/integration/kprove/test_prove_claim_with_lemmas.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
from typing import TYPE_CHECKING
44

5+
from pyk.cterm import CTerm
56
from pyk.kast import KAtt
67
from pyk.kast.inner import KToken
78
from pyk.kast.outer import KClaim, KRule
89
from pyk.prelude.kbool import BOOL
10+
from pyk.prelude.ml import mlOr
911
from pyk.testing import KProveTest
1012

1113
from ..utils import K_FILES
@@ -34,5 +36,5 @@ def test_prove_claim_with_lemmas(self, kprove: KProve) -> None:
3436
result2 = kprove.prove_claim(claim, 'claim-with-lemma', lemmas=[lemma])
3537

3638
# Then
37-
assert not result1.is_top
38-
assert result2.is_top
39+
assert not CTerm._is_top(mlOr([res.kast for res in result1]))
40+
assert CTerm._is_top(mlOr([res.kast for res in result2]))

0 commit comments

Comments
 (0)