28
28
from collections .abc import Iterator
29
29
from subprocess import CompletedProcess
30
30
31
+ from pyk .kast .outer import KFlatModule
31
32
from pyk .utils import BugReport
32
33
33
-
34
- sys .setrecursionlimit (4000 )
34
+ sys .setrecursionlimit (8000 )
35
35
36
36
37
37
class Backend (Enum ):
@@ -59,6 +59,7 @@ def main() -> None:
59
59
dir_path = args .directory ,
60
60
wasm = wasm ,
61
61
id = args .id ,
62
+ extra_module = args .extra_module ,
62
63
always_allocate = args .always_allocate ,
63
64
proof_dir = args .proof_dir ,
64
65
bug_report = args .bug_report ,
@@ -67,10 +68,24 @@ def main() -> None:
67
68
assert args .proof_dir is not None
68
69
_exec_prove_view (proof_dir = args .proof_dir , id = args .id )
69
70
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 )
70
81
elif args .command == 'prove-raw' :
71
82
assert args .claim_file is not None
72
83
_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 ,
74
89
)
75
90
76
91
raise AssertionError ()
@@ -89,10 +104,11 @@ def _exec_prove_raw(
89
104
* ,
90
105
claim_file : Path ,
91
106
label : str | None ,
107
+ extra_module : KFlatModule | None ,
92
108
proof_dir : Path | None ,
93
109
bug_report : BugReport | None = None ,
94
110
) -> None :
95
- kasmer = Kasmer (symbolic_definition )
111
+ kasmer = Kasmer (symbolic_definition , extra_module )
96
112
try :
97
113
kasmer .prove_raw (claim_file , label , proof_dir , bug_report )
98
114
exit (0 )
@@ -157,12 +173,13 @@ def _exec_prove_run(
157
173
dir_path : Path | None ,
158
174
wasm : Path | None ,
159
175
id : str | None ,
176
+ extra_module : KFlatModule | None ,
160
177
always_allocate : bool ,
161
178
proof_dir : Path | None ,
162
179
bug_report : BugReport | None = None ,
163
180
) -> None :
164
181
dir_path = Path .cwd () if dir_path is None else dir_path
165
- kasmer = Kasmer (symbolic_definition )
182
+ kasmer = Kasmer (symbolic_definition , extra_module )
166
183
167
184
child_wasms : tuple [Path , ...] = ()
168
185
@@ -202,6 +219,20 @@ def _exec_prove_view(*, proof_dir: Path, id: str) -> None:
202
219
sys .exit (0 )
203
220
204
221
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
+
205
236
@contextmanager
206
237
def _preprocessed (program : Path ) -> Iterator [Path ]:
207
238
program_text = program .read_text ()
@@ -219,6 +250,14 @@ def _exit_with_output(cp: CompletedProcess) -> None:
219
250
sys .exit (status )
220
251
221
252
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
+
222
261
def _argument_parser () -> ArgumentParser :
223
262
parser = ArgumentParser (prog = 'komet' )
224
263
command_parser = parser .add_subparsers (dest = 'command' , required = True )
@@ -243,24 +282,22 @@ def _argument_parser() -> ArgumentParser:
243
282
prove_parser .add_argument (
244
283
'prove_command' ,
245
284
default = 'run' ,
246
- choices = ('run' , 'view' ),
285
+ choices = ('run' , 'view' , 'view-node' , 'remove-node' ),
247
286
metavar = 'COMMAND' ,
248
287
help = 'Proof command to run. One of (%(choices)s)' ,
249
288
)
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
+
252
292
_add_common_test_arguments (prove_parser )
253
293
254
294
prove_raw_parser = command_parser .add_parser (
255
295
'prove-raw' ,
256
296
help = 'Prove K claims directly from a file, bypassing the usual test contract structure; intended for development and advanced users.' ,
257
297
)
258
298
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
- )
263
299
prove_raw_parser .add_argument ('--label' , help = 'Label of the K claim in the file' )
300
+ _add_common_prove_arguments (prove_raw_parser )
264
301
265
302
return parser
266
303
@@ -280,3 +317,18 @@ def _add_common_test_arguments(parser: ArgumentParser) -> None:
280
317
default = None ,
281
318
help = 'The working directory for the command (defaults to the current working directory).' ,
282
319
)
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