2828 from collections .abc import Iterator
2929 from subprocess import CompletedProcess
3030
31+ from pyk .kast .outer import KFlatModule
3132 from pyk .utils import BugReport
3233
33-
34- sys .setrecursionlimit (4000 )
34+ sys .setrecursionlimit (8000 )
3535
3636
3737class Backend (Enum ):
@@ -59,6 +59,7 @@ def main() -> None:
5959 dir_path = args .directory ,
6060 wasm = wasm ,
6161 id = args .id ,
62+ extra_module = args .extra_module ,
6263 always_allocate = args .always_allocate ,
6364 proof_dir = args .proof_dir ,
6465 bug_report = args .bug_report ,
@@ -67,10 +68,24 @@ def main() -> None:
6768 assert args .proof_dir is not None
6869 _exec_prove_view (proof_dir = args .proof_dir , id = args .id )
6970
71+ if args .prove_command == 'view-node' :
72+ assert args .proof_dir is not None
73+ assert args .id is not None
74+ assert args .node is not None
75+ _exec_prove_view_node (proof_dir = args .proof_dir , id = args .id , node = args .node )
76+ if args .prove_command == 'remove-node' :
77+ assert args .proof_dir is not None
78+ assert args .id is not None
79+ assert args .node is not None
80+ _exec_prove_remove_node (proof_dir = args .proof_dir , id = args .id , node = args .node )
7081 elif args .command == 'prove-raw' :
7182 assert args .claim_file is not None
7283 _exec_prove_raw (
73- claim_file = args .claim_file , label = args .label , proof_dir = args .proof_dir , bug_report = args .bug_report
84+ claim_file = args .claim_file ,
85+ label = args .label ,
86+ extra_module = args .extra_module ,
87+ proof_dir = args .proof_dir ,
88+ bug_report = args .bug_report ,
7489 )
7590
7691 raise AssertionError ()
@@ -89,10 +104,11 @@ def _exec_prove_raw(
89104 * ,
90105 claim_file : Path ,
91106 label : str | None ,
107+ extra_module : KFlatModule | None ,
92108 proof_dir : Path | None ,
93109 bug_report : BugReport | None = None ,
94110) -> None :
95- kasmer = Kasmer (symbolic_definition )
111+ kasmer = Kasmer (symbolic_definition , extra_module )
96112 try :
97113 kasmer .prove_raw (claim_file , label , proof_dir , bug_report )
98114 exit (0 )
@@ -157,12 +173,13 @@ def _exec_prove_run(
157173 dir_path : Path | None ,
158174 wasm : Path | None ,
159175 id : str | None ,
176+ extra_module : KFlatModule | None ,
160177 always_allocate : bool ,
161178 proof_dir : Path | None ,
162179 bug_report : BugReport | None = None ,
163180) -> None :
164181 dir_path = Path .cwd () if dir_path is None else dir_path
165- kasmer = Kasmer (symbolic_definition )
182+ kasmer = Kasmer (symbolic_definition , extra_module )
166183
167184 child_wasms : tuple [Path , ...] = ()
168185
@@ -202,6 +219,20 @@ def _exec_prove_view(*, proof_dir: Path, id: str) -> None:
202219 sys .exit (0 )
203220
204221
222+ def _exec_prove_view_node (* , proof_dir : Path , id : str , node : int ) -> None :
223+ proof = APRProof .read_proof_data (proof_dir , id )
224+ config = proof .kcfg .node (node ).cterm .config
225+ print (symbolic_definition .krun .pretty_print (config ))
226+ sys .exit (0 )
227+
228+
229+ def _exec_prove_remove_node (* , proof_dir : Path , id : str , node : int ) -> None :
230+ proof = APRProof .read_proof_data (proof_dir , id )
231+ proof .prune (node )
232+ proof .write_proof_data ()
233+ sys .exit (0 )
234+
235+
205236@contextmanager
206237def _preprocessed (program : Path ) -> Iterator [Path ]:
207238 program_text = program .read_text ()
@@ -219,6 +250,14 @@ def _exit_with_output(cp: CompletedProcess) -> None:
219250 sys .exit (status )
220251
221252
253+ def extra_module_arg (extra_module : str ) -> KFlatModule :
254+ extra_module_file , extra_module_name , * _ = extra_module .split (':' )
255+ extra_module_path = Path (extra_module_file )
256+ if not extra_module_path .is_file ():
257+ raise ValueError (f'Supplied --extra-module path is not a file: { extra_module_path } ' )
258+ return symbolic_definition .parse_lemmas_module (extra_module_path , extra_module_name )
259+
260+
222261def _argument_parser () -> ArgumentParser :
223262 parser = ArgumentParser (prog = 'komet' )
224263 command_parser = parser .add_subparsers (dest = 'command' , required = True )
@@ -243,24 +282,22 @@ def _argument_parser() -> ArgumentParser:
243282 prove_parser .add_argument (
244283 'prove_command' ,
245284 default = 'run' ,
246- choices = ('run' , 'view' ),
285+ choices = ('run' , 'view' , 'view-node' , 'remove-node' ),
247286 metavar = 'COMMAND' ,
248287 help = 'Proof command to run. One of (%(choices)s)' ,
249288 )
250- prove_parser .add_argument ('--proof-dir' , type = ensure_dir_path , default = None , help = 'Output directory for proofs' )
251- prove_parser .add_argument ('--bug-report' , type = bug_report_arg , default = None , help = 'Bug report directory for proofs' )
289+ prove_parser .add_argument ('--node' , type = int )
290+ _add_common_prove_arguments (prove_parser )
291+
252292 _add_common_test_arguments (prove_parser )
253293
254294 prove_raw_parser = command_parser .add_parser (
255295 'prove-raw' ,
256296 help = 'Prove K claims directly from a file, bypassing the usual test contract structure; intended for development and advanced users.' ,
257297 )
258298 prove_raw_parser .add_argument ('claim_file' , metavar = 'CLAIM_FILE' , type = file_path , help = 'path to claim file' )
259- prove_raw_parser .add_argument ('--proof-dir' , type = ensure_dir_path , default = None , help = 'Output directory for proofs' )
260- prove_raw_parser .add_argument (
261- '--bug-report' , type = bug_report_arg , default = None , help = 'Bug report directory for proofs'
262- )
263299 prove_raw_parser .add_argument ('--label' , help = 'Label of the K claim in the file' )
300+ _add_common_prove_arguments (prove_raw_parser )
264301
265302 return parser
266303
@@ -280,3 +317,18 @@ def _add_common_test_arguments(parser: ArgumentParser) -> None:
280317 default = None ,
281318 help = 'The working directory for the command (defaults to the current working directory).' ,
282319 )
320+
321+
322+ def _add_common_prove_arguments (parser : ArgumentParser ) -> None :
323+ parser .add_argument ('--proof-dir' , type = ensure_dir_path , default = None , help = 'Output directory for proofs' )
324+ parser .add_argument ('--bug-report' , type = bug_report_arg , default = None , help = 'Bug report directory for proofs' )
325+ parser .add_argument (
326+ '--extra-module' ,
327+ dest = 'extra_module' ,
328+ default = None ,
329+ type = extra_module_arg ,
330+ help = (
331+ 'Extra module with user-defined lemmas to include for verification (which must import KASMER module).'
332+ 'Format is <file>:<module name>.'
333+ ),
334+ )
0 commit comments