use of suite.node.Tree in project suite by stupidsing.
the class SeqIntrinsics method deepSeq.
private Node deepSeq(IntrinsicCallback callback, Node node) {
Node node1 = callback.yawn(node);
Tree tree;
if ((tree = Tree.decompose(node1)) != null)
node1 = Tree.of(tree.getOperator(), deepSeq(callback, tree.getLeft()), deepSeq(callback, tree.getRight()));
return callback.enclose(Intrinsics.id_, node1);
}
use of suite.node.Tree in project suite by stupidsing.
the class Binder method bind.
public static boolean bind(Node n0, Node n1, Trail trail) {
n0 = n0.finalNode();
n1 = n1.finalNode();
if (n0 == n1)
return true;
Class<? extends Node> clazz0 = n0.getClass();
Class<? extends Node> clazz1 = n1.getClass();
if (clazz0 == Reference.class) {
trail.addBind((Reference) n0, n1);
return true;
} else if (clazz1 == Reference.class) {
trail.addBind((Reference) n1, n0);
return true;
}
if (clazz0 == Dict.class && clazz1 == Dict.class) {
Map<Node, Reference> map0 = ((Dict) n0).map;
Map<Node, Reference> map1 = ((Dict) n1).map;
boolean b = true;
for (Node key : List_.concat(map0.keySet(), map1.keySet())) {
Node v0 = map0.computeIfAbsent(key, k -> new Reference());
Node v1 = map1.computeIfAbsent(key, k -> new Reference());
b &= bind(v0, v1, trail);
}
return b;
} else if (clazz0 == Int.class && clazz1 == Int.class)
return ((Int) n0).number == ((Int) n1).number;
else if (clazz0 == Str.class && clazz1 == Str.class)
return Objects.equals(((Str) n0).value, ((Str) n1).value);
else if (Tree.class.isAssignableFrom(clazz0) && Tree.class.isAssignableFrom(clazz1)) {
Tree t0 = (Tree) n0;
Tree t1 = (Tree) n1;
return //
t0.getOperator() == t1.getOperator() && //
bind(t0.getLeft(), t1.getLeft(), trail) && bind(t0.getRight(), t1.getRight(), trail);
} else if (clazz0 == Tuple.class && clazz1 == Tuple.class) {
Node[] nodes0 = ((Tuple) n0).nodes;
Node[] nodes1 = ((Tuple) n1).nodes;
boolean b = nodes0.length == nodes1.length;
if (b) {
for (int i = 0; i < nodes0.length; i++) b &= bind(nodes0[i], nodes1[i], trail);
}
return b;
} else
return false;
}
use of suite.node.Tree in project suite by stupidsing.
the class Cloner method cloneRight.
private void cloneRight(Tree tree) {
while (tree != null) {
Tree nextTree = null;
Node right = tree.getRight();
IdentityKey<Node> key = IdentityKey.of(right);
Node right1 = clonedNodes.get(key);
Tree rt;
if (right1 == null) {
if (right instanceof Reference)
right1 = new Reference();
else if ((rt = Tree.decompose(right)) != null)
right1 = nextTree = Tree.of(rt.getOperator(), clone(rt.getLeft()), rt.getRight());
else
right1 = Rewrite_.map(right, this::clone);
clonedNodes.put(key, right1);
}
Tree.forceSetRight(tree, right1);
tree = nextTree;
}
}
use of suite.node.Tree in project suite by stupidsing.
the class Cloner method clone.
public Node clone(Node node) {
Tree tree = Tree.of(null, null, node);
cloneRight(tree);
return tree.getRight();
}
use of suite.node.Tree in project suite by stupidsing.
the class Generalizer method generalizeRight.
private void generalizeRight(Tree tree) {
while (tree != null) {
Tree nextTree = null;
Node right = tree.getRight();
Tree rt;
if (right instanceof Atom) {
Atom atom = (Atom) right;
String name = atom.name;
if (name.startsWith(ProverConstant.wildcardPrefix))
right = new Reference();
if (name.startsWith(ProverConstant.variablePrefix))
right = getVariable(atom);
} else if ((rt = Tree.decompose(right)) != null)
right = nextTree = Tree.of(rt.getOperator(), generalize(rt.getLeft()), rt.getRight());
else
right = Rewrite_.map(right, this::generalize);
Tree.forceSetRight(tree, right);
tree = nextTree;
}
}
Aggregations