Search in sources :

Example 16 with Subterms

use of nars.subterm.Subterms in project narchy by automenta.

the class AnonVector method equals.

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (this.hash != obj.hashCode())
        return false;
    if (obj instanceof AnonVector) {
        return Arrays.equals(subterms, ((AnonVector) obj).subterms);
    }
    if (obj instanceof Subterms) {
        Subterms ss = (Subterms) obj;
        int s = subterms.length;
        if (ss.subs() != s)
            return false;
        for (int i = 0; i < s; i++) {
            if (!sub(i).equals(ss.sub(i)))
                return false;
        }
        return true;
    }
    return false;
}
Also used : Subterms(nars.subterm.Subterms)

Example 17 with Subterms

use of nars.subterm.Subterms in project narchy by automenta.

the class TermTransform method transformCompound.

/**
 * should not be called directly except by implementations of TermTransform
 */
@Nullable
default Term transformCompound(Compound x, Op op, int dt) {
    Subterms xx = x.subterms();
    Subterms yy = transformSubterms(xx);
    if (yy == null) {
        return null;
    } else if (yy != xx || op != x.op()) {
        Term z = the(op, op.temporal ? dt : DTERNAL, (TermList) yy);
        // //seems to happen very infrequently so probably not worth the test
        if (x != z && x.equals(z))
            // unchanged
            return x;
        return z;
    } else {
        return x.dt(dt);
    }
}
Also used : Subterms(nars.subterm.Subterms) Term(nars.term.Term) TermList(nars.subterm.util.TermList) DisposableTermList(nars.subterm.util.DisposableTermList) Nullable(org.jetbrains.annotations.Nullable)

Example 18 with Subterms

use of nars.subterm.Subterms in project narchy by automenta.

the class TermlinkTemplates method templates.

/**
 * recurses
 */
static void templates(Term _x, Set<Term> tc, int depth, Term root, int maxDepth) {
    Term x = _x;
    if (((depth > 0) || selfTermLink(x)) && !tc.add(x))
        // already added
        return;
    if ((++depth >= maxDepth) || !templateRecurseInto(root, depth, x))
        return;
    Subterms bb = x.subterms();
    int bs = bb.subs();
    if (bs > 0) {
        int nextDepth = depth;
        bb.forEach(s -> templates(s.unneg(), tc, nextDepth, root, maxDepth));
    }
}
Also used : Subterms(nars.subterm.Subterms) Term(nars.term.Term)

Example 19 with Subterms

use of nars.subterm.Subterms in project narchy by automenta.

the class TimeGraph method solveDT.

boolean solveDT(Term x, Predicate<Event> each) {
    assert (x.dt() == XTERNAL);
    Subterms xx = x.subterms();
    // FasterList<Event> events = new FasterList<>(byTerm.get(x.root()));
    // for (int i = 0, eventsSize = events.size(); i < eventsSize; i++) {
    // Event r = events.get(i);
    // if (r instanceof Absolute) {
    // if (r.id.subterms().equals(xx)) {
    // if (!each.test(r))
    // return false; //done
    // }
    // }
    // 
    // }
    int subs = xx.subs();
    if (subs == 2) {
        Term a = xx.sub(0);
        Term b = xx.sub(1);
        boolean aEqB = a.equals(b);
        if (!a.hasXternal() && !b.hasXternal() && (aEqB || !commonSubEventsWithMultipleOccurrences(a, b))) {
            UnifiedSet<Event> ae = new UnifiedSet(2);
            solveOccurrence(event(a, TIMELESS), ax -> {
                if (ax instanceof Absolute)
                    ae.add(ax);
                return true;
            });
            int aes = ae.size();
            if (aes > 0) {
                if (aEqB) {
                    // same term, must have >1 absolute timepoints
                    if (aes > 1) {
                        Event[] ab = ae.toArray(new Event[aes]);
                        // Arrays.sort(ab, Comparator.comparingLong(Event::when));
                        for (int i = 0; i < ab.length; i++) {
                            Event abi = ab[i];
                            for (int j = 0; j < ab.length; j++) {
                                if (i == j)
                                    continue;
                                if (!solveDT(x, abi.when(), dt(x, abi, ab[j]), each))
                                    return false;
                            }
                        }
                    }
                } else {
                    UnifiedSet<Event> be = new UnifiedSet(2);
                    solveOccurrence(event(b, TIMELESS), bx -> {
                        if (bx instanceof Absolute)
                            be.add(bx);
                        return true;
                    });
                    int bes = be.size();
                    if (bes > 0) {
                        // if (aes == 1 || bes == 1) {
                        if (!ae.allSatisfy(ax -> be.allSatisfyWith((bx, axx) -> solveDT(x, axx.when(), dt(x, axx, bx), each), ax)))
                            return false;
                    // }
                    }
                }
            }
        }
        // UnifiedSet<Event>[] abs = new UnifiedSet[2]; //exact occurrences of each subterm
        FasterList<Event> rels = new FasterList<>(4);
        // int[] phase = new int[]{0};
        // int p = phase[0];
        // if (z instanceof Absolute) {
        // if (abs[p] == null) abs[p] = new UnifiedSet(2);
        // abs[p].add(z);
        // //}
        // }
        Consumer<Event> collect = rels::add;
        byTerm.get(a).forEach(collect);
        if (aEqB) {
        // abs[1] = abs[0];
        } else {
            // phase[0] = 1;
            byTerm.get(b).forEach(collect);
        // if (abs[1] == null)
        // byTerm.get(b.neg()).forEach(collect);  //if nothing, look for negations
        }
        // if (abs[0] != null && abs[1] != null) {
        // known exact occurrences for both subterms
        // iterate all possibilities
        // TODO order in some way
        // TODO other simple cases: 1 -> N
        // if (abs[0].size() == 1 && abs[1].size() == 1) {
        // //simple case:
        // Event aa = abs[0].iterator().next();
        // Event bb = abs[1].iterator().next();
        // if (!solveDT(x, each, aa, bb))
        // return false;
        // } else {
        // if (!abs[0].allSatisfy(ae ->
        // abs[1].allSatisfyWith((be, aaee) ->
        // solveDT(x, each, aaee, be), ae)))
        // return false;
        // }
        // }
        int ns = rels.size();
        if (ns > 0) {
            if (ns > 1) {
                // sort by volume
                rels.sortThisByInt(s -> s.id.volume());
            }
            return bfs(rels, new CrossTimeSolver() {

                @Override
                protected boolean next(BooleanObjectPair<ImmutableDirectedEdge<Event, TimeSpan>> move, Node<nars.derive.time.TimeGraph.Event, nars.derive.time.TimeGraph.TimeSpan> next) {
                    // System.out.println(path);
                    long[] startDT = pathDT(next, a, b, path);
                    if (startDT == null)
                        // nothing at this step
                        return true;
                    long start = startDT[0];
                    long ddt = startDT[1];
                    return TimeGraph.this.solveDT(x, start, ddt, each);
                }
            });
        }
    // } else {
    // assert (x.op() == CONJ);
    // List<LongObjectPair<Term>> when = $.newArrayList();
    // for (int ix = 0; ix < subs; ix++) {
    // //assert(!z.hasXternal());
    // solveOccurrence(event(xx.sub(ix), TIMELESS), (ze) -> {
    // if (ze.when() == TIMELESS)
    // return true; //keep trying
    // when.add(pair(ze.when(), ze.id));
    // return false; //just one, for now //TODO see if there are any others
    // });
    // }
    // if (when.size() == subs) {
    // when.sort(Comparator.comparingLong(LongObjectPair::getOne));
    // long base = when.get(0).getOne();
    // Term zz = when.get(0).getTwo();
    // for (int i = 1; i < subs; i++) {
    // LongObjectPair<Term> wgi = when.get(i);
    // zz = Op.conjMerge(zz, 0, wgi.getTwo(), wgi.getOne() - base);
    // if (zz instanceof Bool)
    // return true; //failure
    // }
    // return each.test(event(zz, base));
    // }
    }
    // last resort
    return each.test(event(x, TIMELESS));
}
Also used : Subterms(nars.subterm.Subterms) Iterables(com.google.common.collect.Iterables) java.util(java.util) Search(jcog.data.graph.search.Search) CONJ(nars.Op.CONJ) Tense(nars.time.Tense) MultimapBuilder(com.google.common.collect.MultimapBuilder) IMPL(nars.Op.IMPL) Multimap(com.google.common.collect.Multimap) Iterators(com.google.common.collect.Iterators) MathArithmeticException(org.apache.commons.math3.exception.MathArithmeticException) Op(nars.Op) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Bool(nars.term.atom.Bool) LongObjectPair(org.eclipse.collections.api.tuple.primitive.LongObjectPair) Term(nars.term.Term) Predicate(java.util.function.Predicate) TS_ZERO(nars.derive.time.TimeGraph.TimeSpan.TS_ZERO) FasterList(jcog.list.FasterList) MapNodeGraph(jcog.data.graph.MapNodeGraph) Util(jcog.Util) BooleanObjectPair(org.eclipse.collections.api.tuple.primitive.BooleanObjectPair) Consumer(java.util.function.Consumer) Nullable(org.jetbrains.annotations.Nullable) TODO(jcog.TODO) ImmutableDirectedEdge(jcog.data.graph.ImmutableDirectedEdge) Subterms(nars.subterm.Subterms) Cons(jcog.list.Cons) NotNull(org.jetbrains.annotations.NotNull) UnifiedSet(org.eclipse.collections.impl.set.mutable.UnifiedSet) FasterList(jcog.list.FasterList) Term(nars.term.Term) ImmutableDirectedEdge(jcog.data.graph.ImmutableDirectedEdge) UnifiedSet(org.eclipse.collections.impl.set.mutable.UnifiedSet)

Example 20 with Subterms

use of nars.subterm.Subterms in project narchy by automenta.

the class EllipsisMatch method rematch.

public boolean rematch(/*@NotNull*/
Subterms y, /*@NotNull*/
Collection<Term> yFree) {
    /*@NotNull*/
    Subterms x = subterms();
    int xs = x.subs();
    for (int i = 0; i < xs; i++) {
        Term e = x.sub(i);
        // or if something else has matched it
        if (!y.contains(e) || !yFree.remove(e))
            return false;
    }
    return true;
}
Also used : Subterms(nars.subterm.Subterms) Term(nars.term.Term)

Aggregations

Subterms (nars.subterm.Subterms)21 Op (nars.Op)11 Term (nars.term.Term)9 Nullable (org.jetbrains.annotations.Nullable)7 java.util (java.util)3 Predicate (java.util.function.Predicate)3 TODO (jcog.TODO)3 FasterList (jcog.list.FasterList)3 Bool (nars.term.atom.Bool)3 LongObjectPair (org.eclipse.collections.api.tuple.primitive.LongObjectPair)3 Iterables (com.google.common.collect.Iterables)2 Iterators (com.google.common.collect.Iterators)2 Multimap (com.google.common.collect.Multimap)2 MultimapBuilder (com.google.common.collect.MultimapBuilder)2 ThreadLocalRandom (java.util.concurrent.ThreadLocalRandom)2 Consumer (java.util.function.Consumer)2 Util (jcog.Util)2 ImmutableDirectedEdge (jcog.data.graph.ImmutableDirectedEdge)2 MapNodeGraph (jcog.data.graph.MapNodeGraph)2 Search (jcog.data.graph.search.Search)2