@@ -87,17 +87,15 @@ def semantics(self, definition: KDefinition) -> KCFGSemantics:
87
87
def proof_dir (self , tmp_path_factory : TempPathFactory ) -> Path :
88
88
return tmp_path_factory .mktemp ('proofs' )
89
89
90
- def test_apr_proof_unrefute_node (
90
+ def build_prover (
91
91
self ,
92
92
kprove : KProve ,
93
93
proof_dir : Path ,
94
94
kcfg_explore : KCFGExplore ,
95
- ) -> None :
96
- # Given
97
- spec_file = K_FILES / 'refute-node-spec.k'
98
- spec_module = 'REFUTE-NODE-SPEC'
99
- claim_id = 'split-int-succeed'
100
-
95
+ spec_file : Path ,
96
+ spec_module : str ,
97
+ claim_id : str ,
98
+ ) -> APRProver :
101
99
claim = single (
102
100
kprove .get_claims (Path (spec_file ), spec_module_name = spec_module , claim_labels = [f'{ spec_module } .{ claim_id } ' ])
103
101
)
@@ -111,14 +109,27 @@ def test_apr_proof_unrefute_node(
111
109
logs = {},
112
110
proof_dir = proof_dir ,
113
111
)
114
- prover = APRProver (proof , kcfg_explore )
112
+ return APRProver (proof , kcfg_explore )
113
+
114
+ def test_apr_proof_unrefute_node (
115
+ self ,
116
+ kprove : KProve ,
117
+ proof_dir : Path ,
118
+ kcfg_explore : KCFGExplore ,
119
+ ) -> None :
120
+ # Given
121
+ spec_file = K_FILES / 'refute-node-spec.k'
122
+ spec_module = 'REFUTE-NODE-SPEC'
123
+ claim_id = 'split-int-succeed'
124
+
125
+ prover = self .build_prover (kprove , proof_dir , kcfg_explore , spec_file , spec_module , claim_id )
115
126
116
127
# When
117
128
prover .advance_proof (max_iterations = 1 )
118
129
frontier_nodes = prover .proof .pending
119
130
assert prover .proof .status == ProofStatus .PENDING
120
131
121
- assert len (frontier_nodes )
132
+ assert len (frontier_nodes ) == 2
122
133
frontier_node = frontier_nodes [0 ]
123
134
prover .proof .refute_node (frontier_node )
124
135
prover .proof .unrefute_node (frontier_node )
@@ -147,23 +158,7 @@ def test_apr_proof_refute_node(
147
158
spec_module = 'REFUTE-NODE-SPEC'
148
159
claim_id = 'split-int-fail'
149
160
150
- claim = single (
151
- kprove .get_claims (Path (spec_file ), spec_module_name = spec_module , claim_labels = [f'{ spec_module } .{ claim_id } ' ])
152
- )
153
- kcfg_pre , init_node , target_node = KCFG .from_claim (kprove .definition , claim , proof_dir )
154
- proof = APRProof (
155
- f'{ spec_module } .{ claim_id } ' ,
156
- kcfg_pre ,
157
- [],
158
- init = init_node ,
159
- target = target_node ,
160
- logs = {},
161
- proof_dir = proof_dir ,
162
- )
163
- prover = APRProver (
164
- proof ,
165
- kcfg_explore ,
166
- )
161
+ prover = self .build_prover (kprove , proof_dir , kcfg_explore , spec_file , spec_module , claim_id )
167
162
168
163
# When
169
164
prover .advance_proof ()
@@ -196,3 +191,60 @@ def test_apr_proof_refute_node(
196
191
197
192
# Then
198
193
assert prover .proof .status == expected_status
194
+
195
+ def test_apr_proof_read_node_refutations (
196
+ self ,
197
+ kprove : KProve ,
198
+ proof_dir : Path ,
199
+ kcfg_explore : KCFGExplore ,
200
+ ) -> None :
201
+ # Given
202
+ spec_file = K_FILES / 'refute-node-spec.k'
203
+ spec_module = 'REFUTE-NODE-SPEC'
204
+ claim_id = 'split-int-succeed'
205
+
206
+ prover = self .build_prover (kprove , proof_dir , kcfg_explore , spec_file , spec_module , claim_id )
207
+
208
+ # When
209
+ prover .advance_proof (max_iterations = 1 )
210
+ frontier_nodes = prover .proof .pending
211
+ assert prover .proof .status == ProofStatus .PENDING
212
+
213
+ assert len (frontier_nodes ) == 2
214
+ frontier_node = frontier_nodes [0 ]
215
+ prover .proof .refute_node (frontier_node )
216
+
217
+ proof_from_file = APRProof .read_proof_data (proof_dir , prover .proof .id )
218
+ refutation_id = prover .proof .get_refutation_id (frontier_node .id )
219
+
220
+ # Then
221
+ assert len (proof_from_file .node_refutations ) == 1
222
+ assert frontier_node .id in proof_from_file .node_refutations
223
+ assert proof_from_file .node_refutations [frontier_node .id ].id == refutation_id
224
+
225
+ def test_apr_proof_refute_node_no_successors (
226
+ self ,
227
+ kprove : KProve ,
228
+ proof_dir : Path ,
229
+ kcfg_explore : KCFGExplore ,
230
+ ) -> None :
231
+ # Given
232
+ spec_file = K_FILES / 'refute-node-spec.k'
233
+ spec_module = 'REFUTE-NODE-SPEC'
234
+ claim_id = 'split-int-fail'
235
+
236
+ prover = self .build_prover (kprove , proof_dir , kcfg_explore , spec_file , spec_module , claim_id )
237
+
238
+ # When
239
+ prover .advance_proof ()
240
+ failing_node = single (prover .proof .failing )
241
+ predecessors = prover .proof .kcfg .predecessors (failing_node .id )
242
+ assert len (predecessors ) == 1
243
+ predecessor_node = predecessors [0 ].source
244
+
245
+ result_predecessor = prover .proof .refute_node (predecessor_node )
246
+ result_successor = prover .proof .refute_node (failing_node )
247
+
248
+ # Then
249
+ assert result_predecessor is None # fails because the node has successors
250
+ assert result_successor is not None # succeeds because the node has no successors
0 commit comments