assert c.agg_name is None
c.agg_name = agg
for item in c.intern.itervalues():
- assert c.aggregator is None
+ assert item.aggregator is None
item.aggregator = c.new_aggregator()
assert self.agg_name[fn] == agg, (fn, self.agg_name[fn], agg)
"""
Examine solution as an outline of computation.
-TODO: backchained stuff
+TODO: shared substructure.
+
"""
import re
self.interp = interp
def main(self):
- es = infer_edges(self.interp)
+ tracer = Tracer(self.interp)
+ for item in tracer.items:
+ print
+ print tracer(item)
+
+
+class Tracer(object):
+ def __init__(self, interp):
+ self.interp = interp
+ self.edges = infer_edges(self.interp)
# group edges by head then ruleindex
- groups = groupby(lambda x: x[0], es)
+ groups = groupby(lambda x: x[0], self.edges)
for a in groups:
groups[a] = groupby(lambda x: x[1], groups[a])
+ self.items = groups
- for head in groups:
- print '\n'.join(dig(head, set(), groups, self.interp))
+ def __call__(self, item):
+ if item not in self.items:
+ print
+ print 'no trace for', item
+ print '\n'.join(dig(item, set(), self.items, self.interp))
def groupby(key, data):
return dict(g)
-
def dig(head, visited, groups, interp):
if head in visited:
def branch(xs):
-
ys = []
for i, x in enumerate(xs):
first = i == 0
h = '├─ '
else:
h = '├─ '
-
if not x:
continue
-
ys.append(h + x[0])
-
indent = '│ ' if not last else ' '
for a in x[1:]:
ys.append(indent + a)
-
return ys
if not g.incoming[x]: # input variable
return self.values(x)
if len(g.incoming[x]) > 1:
- return 'UNIF ' + ' === '.join(self.get_function(e) + (red % '=%s' % self.values(e.head)) for e in g.incoming[x])
+ return 'UNIFICATION ' + ' === '.join(self.get_function(e) + (red % '=%s' % self.values(e.head)) for e in g.incoming[x])
[e] = g.incoming[x]
if e.label == '=':
show_traceback()
readline.write_history_file(self.hist)
+ def do_trace(self, q):
+
+ if q.endswith('.'):
+ print "Queries don't end with a dot."
+ return
+
+ self.interp.new_rules = set()
+
+ try:
+ query = "$trace dict= _ is %s, &(%s)." % (q,q)
+ self.default(query, show_changed=False)
+ try:
+ [(_, _, results)] = self.interp.chart['$trace/0'][:,]
+ except ValueError:
+ print 'no items matching `%s`.' % q
+ return
+
+ from post.trace import Tracer
+ tracer = Tracer(self.interp)
+ for item, _ in results:
+ print
+ tracer(item)
+
+ finally:
+ # cleanup:
+ # retract newly added rules.
+ for r in self.interp.new_rules:
+ self.interp.retract_rule(r)
+ # drop $out chart
+ del self.interp.chart['$trace/0']
+
do_load.__doc__ = do_load.__doc__.format(load=', '.join(load.available))
do_post.__doc__ = do_post.__doc__.format(post=', '.join(post.available))