Search in sources :

Example 26 with Tree

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);
}
Also used : Node(suite.node.Node) Tree(suite.node.Tree)

Example 27 with Tree

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;
}
Also used : Str(suite.node.Str) Reference(suite.node.Reference) Dict(suite.node.Dict) Node(suite.node.Node) Tree(suite.node.Tree) Tuple(suite.node.Tuple)

Example 28 with Tree

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;
    }
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) Tree(suite.node.Tree)

Example 29 with Tree

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();
}
Also used : Tree(suite.node.Tree)

Example 30 with Tree

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;
    }
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) Tree(suite.node.Tree) Atom(suite.node.Atom)

Aggregations

Tree (suite.node.Tree)47 Node (suite.node.Node)36 Reference (suite.node.Reference)19 Atom (suite.node.Atom)14 Int (suite.node.Int)13 TermOp (suite.node.io.TermOp)11 Tuple (suite.node.Tuple)10 ArrayList (java.util.ArrayList)9 Pair (suite.adt.pair.Pair)9 Operator (suite.node.io.Operator)9 Read (suite.streamlet.Read)9 List (java.util.List)8 Dict (suite.node.Dict)8 Map (java.util.Map)7 Str (suite.node.Str)7 Binder (suite.lp.doer.Binder)6 HashMap (java.util.HashMap)5 Generalizer (suite.lp.doer.Generalizer)5 VariableMapper (suite.lp.sewing.VariableMapper)5 TreeUtil (suite.node.util.TreeUtil)5