use of nars.derive.rule.DeriveRuleProto in project narchy by automenta.
the class EllipsisTest method testVarArg0.
@Disabled
@Test
public void testVarArg0() throws Narsese.NarseseException {
// String rule = "(%S --> %M), ((|, %S, %A..+ ) --> %M) |- ((|, %A, ..) --> %M), (Belief:DecomposePositiveNegativeNegative)";
String rule = "(%S ==> %M), ((&&,%S,%A..+) ==> %M) |- ((&&,%A..+) ==> %M), (Belief:DecomposeNegativePositivePositive, Order:ForAllSame, SequenceIntervals:FromBelief)";
Compound _x = $.$('<' + rule + '>');
assertTrue(_x instanceof DeriveRuleSource, _x.toString());
DeriveRuleSource x = (DeriveRuleSource) _x;
// System.out.println(x);
x = new DeriveRuleProto(x, new PatternIndex());
// System.out.println(x);
assertEquals("(((%1==>%2),((%1&&%3..+)==>%2)),(((&&,%3..+)==>%2),((DecomposeNegativePositivePositive-->Belief),(ForAllSame-->Order),(FromBelief-->SequenceIntervals))))", x.toString());
}
use of nars.derive.rule.DeriveRuleProto in project narchy by automenta.
the class Conclude method match.
public static void match(final DeriveRuleProto rule, List<PrediTerm<PreDerivation>> pre, List<PrediTerm<Derivation>> post, PatternIndex index, NAR nar) {
Term pattern = rule.conclusion().sub(0);
// TODO may interfere with constraints, functors, etc or other features, ie.
// if the pattern is a product for example?
// pattern = pattern.replace(ta, Derivation._taskTerm);
// determine if any cases where a shortcut like this can work (ie. no constraints, not a product etc)
// //substitute compound occurrences of the exact task and belief terms with the short-cut
// Term ta = rule.getTask();
// if (!ta.op().var) {
// if (pattern.equals(ta))
// pattern = Derivation.TaskTerm;
// }
// Term tb = rule.getBelief();
// if (!tb.op().var) {
// //pattern = pattern.replace(tb, Derivation._beliefTerm);
// if (pattern.equals(tb))
// pattern = Derivation.BeliefTerm;
// }
// HACK unwrap varIntro so we can apply it at the end of the derivation process, not before like other functors
boolean introVars1;
Pair<Termed, Term> outerFunctor = Op.functor(pattern, (i) -> i.equals(VAR_INTRO) ? VAR_INTRO : null);
if (outerFunctor != null) {
introVars1 = true;
pattern = outerFunctor.getTwo().sub(0);
} else {
introVars1 = false;
}
pattern = index.get(pattern, true).term();
Taskify taskify = new Taskify(nar.newCause((s) -> new RuleCause(rule, s)));
PrediTerm<Derivation> conc = AndCondition.the(new Termify($.func("derive", pattern), pattern, rule), introVars1 ? AndCondition.the(introVars, taskify) : taskify);
final Term taskPattern = rule.getTask();
final Term beliefPattern = rule.getBelief();
Op to = taskPattern.op();
boolean taskIsPatVar = to == Op.VAR_PATTERN;
Op bo = beliefPattern.op();
boolean belIsPatVar = bo == Op.VAR_PATTERN;
if (!taskIsPatVar) {
pre.add(new TaskBeliefOp(to, true, false));
pre.addAll(SubTermStructure.get(0, taskPattern.structure()));
}
if (!belIsPatVar) {
if (to == bo) {
pre.add(new AbstractPatternOp.TaskBeliefOpEqual());
} else {
pre.add(new TaskBeliefOp(bo, false, true));
pre.addAll(SubTermStructure.get(1, beliefPattern.structure()));
}
}
if (taskPattern.equals(beliefPattern)) {
post.add(new UnifyTerm.UnifySubtermThenConclude(0, taskPattern, conc));
}
if (taskFirst(taskPattern, beliefPattern)) {
// task first
post.add(new UnifyTerm.UnifySubterm(0, taskPattern));
post.add(new UnifyTerm.UnifySubtermThenConclude(1, beliefPattern, conc));
} else {
// belief first
post.add(new UnifyTerm.UnifySubterm(1, beliefPattern));
post.add(new UnifyTerm.UnifySubtermThenConclude(0, taskPattern, conc));
}
// Term beliefPattern = pattern.term(1);
// if (Global.DEBUG) {
// if (beliefPattern.structure() == 0) {
// if nothing else in the rule involves this term
// which will be a singular VAR_PATTERN variable
// then allow null
// if (beliefPattern.op() != Op.VAR_PATTERN)
// throw new RuntimeException("not what was expected");
// }
// }
/*System.out.println( Long.toBinaryString(
pStructure) + " " + pattern
);*/
}
Aggregations