|
30 | 30 | set_cell,
|
31 | 31 | top_down,
|
32 | 32 | )
|
33 |
| -from pyk.kast.outer import KDefinition, KFlatModule, KImport, KRequire |
| 33 | +from pyk.kast.outer import KDefinition, KFlatModule, KImport, KRequire, KRule |
34 | 34 | from pyk.kcfg import KCFG
|
35 | 35 | from pyk.kcfg.kcfg import Step
|
36 | 36 | from pyk.kcfg.minimize import KCFGMinimizer
|
@@ -552,6 +552,22 @@ def build(self, metadata: bool) -> None:
|
552 | 552 | except CalledProcessError as err:
|
553 | 553 | raise RuntimeError(f"Couldn't forge build! {err.stderr.strip()}") from err
|
554 | 554 |
|
| 555 | + def load_lemmas(self, lemmas_id: str | None) -> KFlatModule | None: |
| 556 | + if lemmas_id is None: |
| 557 | + return None |
| 558 | + lemmas_file, lemmas_name, *_ = lemmas_id.split(':') |
| 559 | + lemmas_path = Path(lemmas_file) |
| 560 | + if not lemmas_path.is_file(): |
| 561 | + raise ValueError(f'Supplied lemmas path is not a file: {lemmas_path}') |
| 562 | + modules = self.kevm.parse_modules( |
| 563 | + lemmas_path, module_name=lemmas_name, include_dirs=(kdist.get('kontrol.base'),) |
| 564 | + ) |
| 565 | + lemmas_module = single(module for module in modules.modules if module.name == lemmas_name) |
| 566 | + non_rule_sentences = [sent for sent in lemmas_module.sentences if not isinstance(sent, KRule)] |
| 567 | + if non_rule_sentences: |
| 568 | + raise ValueError(f'Supplied lemmas module contains non-Rule sentences: {non_rule_sentences}') |
| 569 | + return lemmas_module |
| 570 | + |
555 | 571 | @cached_property
|
556 | 572 | def all_tests(self) -> list[str]:
|
557 | 573 | test_dir = os.path.join(self.profile.get('test', 'test'), '')
|
@@ -971,6 +987,7 @@ def foundry_show(
|
971 | 987 | smt_retry_limit=options.smt_retry_limit,
|
972 | 988 | start_server=start_server,
|
973 | 989 | port=options.port,
|
| 990 | + extra_module=foundry.load_lemmas(options.lemmas), |
974 | 991 | ) as kcfg_explore:
|
975 | 992 | res_lines += print_failure_info(proof, kcfg_explore, options.counterexample_info)
|
976 | 993 | res_lines += Foundry.help_info()
|
@@ -1234,6 +1251,7 @@ def foundry_simplify_node(
|
1234 | 1251 | log_fail_rewrites=options.log_fail_rewrites,
|
1235 | 1252 | start_server=start_server,
|
1236 | 1253 | port=options.port,
|
| 1254 | + extra_module=foundry.load_lemmas(options.lemmas), |
1237 | 1255 | ) as kcfg_explore:
|
1238 | 1256 | new_term, _ = kcfg_explore.cterm_symbolic.simplify(cterm)
|
1239 | 1257 | if options.replace:
|
@@ -1322,6 +1340,7 @@ def foundry_step_node(
|
1322 | 1340 | log_fail_rewrites=options.log_fail_rewrites,
|
1323 | 1341 | start_server=start_server,
|
1324 | 1342 | port=options.port,
|
| 1343 | + extra_module=foundry.load_lemmas(options.lemmas), |
1325 | 1344 | ) as kcfg_explore:
|
1326 | 1345 | node = options.node
|
1327 | 1346 | for _i in range(options.repeat):
|
@@ -1398,6 +1417,7 @@ def foundry_section_edge(
|
1398 | 1417 | log_fail_rewrites=options.log_fail_rewrites,
|
1399 | 1418 | start_server=start_server,
|
1400 | 1419 | port=options.port,
|
| 1420 | + extra_module=foundry.load_lemmas(options.lemmas), |
1401 | 1421 | ) as kcfg_explore:
|
1402 | 1422 | kcfg_explore.section_edge(
|
1403 | 1423 | apr_proof.kcfg,
|
@@ -1449,6 +1469,7 @@ def foundry_get_model(
|
1449 | 1469 | log_fail_rewrites=options.log_fail_rewrites,
|
1450 | 1470 | start_server=start_server,
|
1451 | 1471 | port=options.port,
|
| 1472 | + extra_module=foundry.load_lemmas(options.lemmas), |
1452 | 1473 | ) as kcfg_explore:
|
1453 | 1474 | for node_id in nodes:
|
1454 | 1475 | res_lines.append('')
|
|
0 commit comments