Skip to content

Commit b1370ad

Browse files
committed
lib/render-proof-tree: Prints prints current goal, and trace cells
1 parent cff8604 commit b1370ad

File tree

2 files changed

+66
-13
lines changed

2 files changed

+66
-13
lines changed

prover/lib/render-proof-tree

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,92 @@
11
#!/usr/bin/env python
22

3+
usage = \
4+
"""Prints the proof tree and either the active goal, or the specified goal.
5+
6+
Usage:
7+
8+
lib/render-proof-tree <filename> [goal_id]
9+
"""
10+
11+
import sys
12+
import os
13+
sys.path.append(os.path.join(os.path.dirname(__file__), '../ext/k/k-distribution/target/release/k/lib/'))
14+
import pyk
15+
316
from anytree import NodeMixin, Node, RenderTree
417
from collections import namedtuple
518
import textwrap
619
import fileinput
720
import re
821

922

23+
# Parse args
24+
# ----------
25+
26+
if len(sys.argv) < 2 or len(sys.argv) > 3: print(usage); exit(1)
27+
input_file = sys.argv[1]
28+
selected_id = None
29+
if len(sys.argv) == 3: selected_id = sys.argv[2]
30+
1031
class Goal(NodeMixin):
11-
def __init__(self, id, parent_id):
32+
def __init__(self, id, parent_id, active):
1233
self.id = id
1334
self.name = id
1435
self.parent_id = parent_id
36+
self.active = active
1537
self.claim = None
38+
self.trace = None
39+
40+
# Parse K output
41+
# --------------
1642

1743
nodes = {}
1844
roots = []
45+
next_line_is_claim = False
46+
next_line_is_trace = False
1947

20-
for line in fileinput.input():
21-
match = re.search(' *active: \w*, id: (\w*\d*), parent: (\.|\w*\d*)', line)
22-
if not match is None:
23-
id = match.group(1)
24-
parent = match.group(2)
25-
node = Goal(id, parent)
48+
with open(input_file) as f:
49+
for line in f:
50+
match = re.search(' *active: (\w*), id: (\w*\d*), parent: (\.|\w*\d*)', line)
51+
if match is not None:
52+
active = match.group(1) == 'true'
53+
id = match.group(2)
54+
parent = match.group(3)
55+
node = Goal(id, parent, active)
2656
nodes[id] = node
2757
if parent == '.': roots += [node]
28-
match = re.search('implies', line)
29-
if not match is None:
30-
node.claim = line
58+
if next_line_is_claim: node.claim = line.strip(); next_line_is_claim = False
59+
if next_line_is_trace: node.trace = line.strip(); next_line_is_trace = False
60+
next_line_is_claim = re.search('<claim>', line) is not None
61+
next_line_is_trace = re.search('<trace>', line) is not None
62+
63+
# Build proof tree
64+
# ----------------
3165

3266
for id, node in nodes.items():
3367
if node in roots: continue
3468
node.parent = nodes[node.parent_id]
3569

70+
# Print proof tree
71+
# ----------------
72+
73+
def is_node_selected(node):
74+
if selected_id is None: return node.active
75+
return node.id == selected_id
76+
77+
term_normal ='\033[0m'
78+
term_bold ='\033[1m'
79+
term_reverse ='\033[7m'
80+
for pre, fill, node in RenderTree(roots[0]):
81+
if is_node_selected(node):
82+
pre += term_reverse
83+
print( pre, 'id: ', node.id, ','
84+
, 'trace:', node.trace
85+
, term_normal
86+
)
87+
3688
for pre, fill, node in RenderTree(roots[0]):
37-
print(pre, 'id: ', node.id, 'x')
38-
# if not node.claim is None:
39-
# print(('\n' + fill).join(textwrap.wrap('claim: ' + node.claim)))
89+
if is_node_selected(node):
90+
print('id:', node.id)
91+
print('claim:', node.claim)
4092

prover/strategies/core.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ cooled back into the sequence strategy.
6464
```k
6565
syntax ResultStrategy ::= "#hole"
6666
rule <strategy> S1 . S2 => S1 ~> #hole . S2 </strategy>
67+
<trace> _ => S1 </trace>
6768
requires notBool(isResultStrategy(S1))
6869
andBool notBool(isSequenceStrategy(S1))
6970
rule <claim> GOAL:Pattern </claim>

0 commit comments

Comments
 (0)