use of nars.language.Term in project opennars by opennars.
the class CompositionalRules method eliminateVariableOfConditionAbductive.
/*
The other inversion (abduction) should also be studied:
IN: <<lock1 --> (/,open,$1,_)> ==> <$1 --> key>>.
IN: <(&&,<#1 --> lock>,<#1 --> (/,open,$2,_)>) ==> <$2 --> key>>.
OUT: <lock1 --> lock>.
http://code.google.com/p/open-nars/issues/detail?id=40&can=1
*/
public static void eliminateVariableOfConditionAbductive(final int figure, final Sentence sentence, final Sentence belief, final DerivationContext nal) {
Statement T1 = (Statement) sentence.term;
Statement T2 = (Statement) belief.term;
Term S1 = T2.getSubject();
Term S2 = T1.getSubject();
Term P1 = T2.getPredicate();
Term P2 = T1.getPredicate();
HashMap<Term, Term> res1 = new HashMap<>();
HashMap<Term, Term> res2 = new HashMap<>();
HashMap<Term, Term> res3 = new HashMap<>();
HashMap<Term, Term> res4 = new HashMap<>();
if (figure == 21) {
res1.clear();
res2.clear();
// this part is
Variables.findSubstitute(Symbols.VAR_INDEPENDENT, P1, S2, res1, res2);
// independent, the rule works if it unifies
T1 = (Statement) T1.applySubstitute(res2);
if (T1 == null) {
return;
}
T2 = (Statement) T2.applySubstitute(res1);
if (T2 == null) {
return;
}
S1 = T2.getSubject();
S2 = T1.getSubject();
P1 = T2.getPredicate();
// update the variables because T1 and T2 may have changed
P2 = T1.getPredicate();
if (S1 instanceof Conjunction) {
// try to unify P2 with a component
for (final Term s1 : ((CompoundTerm) S1).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, P2, res3, res4)) {
for (Term s2 : ((CompoundTerm) S1).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (!s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
if (P2 instanceof Conjunction) {
// try to unify S1 with a component
for (final Term s1 : ((CompoundTerm) P2).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, S1, res3, res4)) {
for (Term s2 : ((CompoundTerm) P2).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (!s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
}
if (figure == 12) {
res1.clear();
res2.clear();
// this part is
Variables.findSubstitute(Symbols.VAR_INDEPENDENT, S1, P2, res1, res2);
// independent, the rule works if it unifies
T1 = (Statement) T1.applySubstitute(res2);
if (T1 == null) {
return;
}
T2 = (Statement) T2.applySubstitute(res1);
if (T2 == null) {
return;
}
S1 = T2.getSubject();
S2 = T1.getSubject();
P1 = T2.getPredicate();
// update the variables because T1 and T2 may have changed
P2 = T1.getPredicate();
if (S2 instanceof Conjunction) {
// try to unify P1 with a component
for (final Term s1 : ((CompoundTerm) S2).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, P1, res3, res4)) {
for (Term s2 : ((CompoundTerm) S2).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (!s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
if (P1 instanceof Conjunction) {
// try to unify S2 with a component
for (final Term s1 : ((CompoundTerm) P1).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, S2, res3, res4)) {
for (Term s2 : ((CompoundTerm) P1).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (!s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
}
if (figure == 11) {
res1.clear();
res2.clear();
// this part is
Variables.findSubstitute(Symbols.VAR_INDEPENDENT, S1, S2, res1, res2);
// independent, the rule works if it unifies
T1 = (Statement) T1.applySubstitute(res2);
if (T1 == null) {
return;
}
T2 = (Statement) T2.applySubstitute(res1);
if (T2 == null) {
return;
}
S1 = T2.getSubject();
S2 = T1.getSubject();
P1 = T2.getPredicate();
// update the variables because T1 and T2 may have changed
P2 = T1.getPredicate();
if (P1 instanceof Conjunction) {
// try to unify P2 with a component
for (final Term s1 : ((CompoundTerm) P1).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, P2, res3, res4)) {
for (Term s2 : ((CompoundTerm) P1).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if ((!s2.equals(s1)) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
if (P2 instanceof Conjunction) {
// try to unify P1 with a component
for (final Term s1 : ((CompoundTerm) P2).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, P1, res3, res4)) {
for (Term s2 : ((CompoundTerm) P2).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (!s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
}
if (figure == 22) {
res1.clear();
res2.clear();
// this part is
Variables.findSubstitute(Symbols.VAR_INDEPENDENT, P1, P2, res1, res2);
// independent, the rule works if it unifies
T1 = (Statement) T1.applySubstitute(res2);
if (T1 == null) {
return;
}
T2 = (Statement) T2.applySubstitute(res1);
if (T2 == null) {
return;
}
S1 = T2.getSubject();
S2 = T1.getSubject();
P1 = T2.getPredicate();
// update the variables because T1 and T2 may have changed
P2 = T1.getPredicate();
if (S1 instanceof Conjunction) {
// try to unify S2 with a component
for (final Term s1 : ((CompoundTerm) S1).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, S2, res3, res4)) {
for (Term s2 : ((CompoundTerm) S1).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (s2 != null && !s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
if (S2 instanceof Conjunction) {
// try to unify S1 with a component
for (final Term s1 : ((CompoundTerm) S2).term) {
res3.clear();
// here the dependent part matters, see example of Issue40
res4.clear();
if (Variables.findSubstitute(Symbols.VAR_DEPENDENT, s1, S1, res3, res4)) {
for (Term s2 : ((CompoundTerm) S2).term) {
if (!(s2 instanceof CompoundTerm)) {
continue;
}
s2 = ((CompoundTerm) s2).applySubstitute(res3);
if (s2 == null || s2.hasVarIndep()) {
continue;
}
if (s2 != null && !s2.equals(s1) && (sentence.truth != null) && (belief.truth != null)) {
TruthValue truth = abduction(sentence.truth, belief.truth);
BudgetValue budget = BudgetFunctions.compoundForward(truth, s2, nal);
nal.doublePremiseTask(s2, truth, budget, false, false);
}
}
}
}
}
}
}
use of nars.language.Term in project opennars by opennars.
the class CompositionalRules method processComposed.
/**
* Finish composing implication term
*
* @param premise1 Type of the contentInd
* @param subject Subject of contentInd
* @param predicate Predicate of contentInd
* @param truth TruthValue of the contentInd
* @param memory Reference to the memory
*/
private static void processComposed(final Statement statement, final Term subject, final Term predicate, final int order, final TruthValue truth, final DerivationContext nal) {
if ((subject == null) || (predicate == null)) {
return;
}
Term content = Statement.make(statement, subject, predicate, order);
if ((content == null) || statement == null || content.equals(statement) || content.equals(nal.getCurrentBelief().term)) {
return;
}
BudgetValue budget = BudgetFunctions.compoundForward(truth, content, nal);
// (allow overlap) but not needed here, isn't detachment, this one would be even problematic from control perspective because its composition
nal.doublePremiseTask(content, truth, budget, false, false);
}
use of nars.language.Term in project opennars by opennars.
the class CompositionalRules method introVarOuter.
/* --------------- rules used for variable introduction --------------- */
/**
* Introduce a dependent variable in an outer-layer conjunction {<S --> P1>,
* <S --> P2>} |- (&&, <#x --> P1>, <#x --> P2>)
*
* @param taskContent The first premise <M --> S>
* @param beliefContent The second premise <M --> P>
* @param index The location of the shared term: 0 for subject, 1 for
* predicate
* @param nal Reference to the memory
*/
public static void introVarOuter(final Statement taskContent, final Statement beliefContent, final int index, final DerivationContext nal) {
if (!(taskContent instanceof Inheritance)) {
return;
}
Variable varInd1 = new Variable("$varInd1");
Variable varInd2 = new Variable("$varInd2");
Term term11dependent = null, term12dependent = null, term21dependent = null, term22dependent = null;
Term term11, term12, term21, term22, commonTerm = null;
HashMap<Term, Term> subs = new HashMap<>();
if (index == 0) {
term11 = varInd1;
term21 = varInd1;
term12 = taskContent.getPredicate();
term22 = beliefContent.getPredicate();
term12dependent = term12;
term22dependent = term22;
if (term12 instanceof ImageExt) {
if ((/*(ImageExt)*/
term12).containsTermRecursively(term22)) {
commonTerm = term22;
}
if (commonTerm == null && term12 instanceof ImageExt) {
commonTerm = ((ImageExt) term12).getTheOtherComponent();
if (!(term22.containsTermRecursively(commonTerm))) {
commonTerm = null;
}
if (term22 instanceof ImageExt && ((commonTerm == null) || !(term22).containsTermRecursively(commonTerm))) {
commonTerm = ((ImageExt) term22).getTheOtherComponent();
if ((commonTerm == null) || !(term12).containsTermRecursively(commonTerm)) {
commonTerm = null;
}
}
}
if (commonTerm != null) {
subs.put(commonTerm, varInd2);
term12 = ((CompoundTerm) term12).applySubstitute(subs);
if (!(term22 instanceof CompoundTerm)) {
term22 = varInd2;
} else {
term22 = ((CompoundTerm) term22).applySubstitute(subs);
}
}
}
if (commonTerm == null && term22 instanceof ImageExt) {
if ((/*(ImageExt)*/
term22).containsTermRecursively(term12)) {
commonTerm = term12;
}
if (commonTerm == null && term22 instanceof ImageExt) {
commonTerm = ((ImageExt) term22).getTheOtherComponent();
if (!(term12.containsTermRecursively(commonTerm))) {
commonTerm = null;
}
if (term12 instanceof ImageExt && ((commonTerm == null) || !(term12).containsTermRecursively(commonTerm))) {
commonTerm = ((ImageExt) term12).getTheOtherComponent();
if ((commonTerm == null) || !(term22).containsTermRecursively(commonTerm)) {
commonTerm = null;
}
}
}
if (commonTerm != null) {
subs.put(commonTerm, varInd2);
term22 = ((CompoundTerm) term22).applySubstitute(subs);
if (!(term12 instanceof CompoundTerm)) {
term12 = varInd2;
} else {
term12 = ((CompoundTerm) term12).applySubstitute(subs);
}
}
}
} else {
term11 = taskContent.getSubject();
term21 = beliefContent.getSubject();
term12 = varInd1;
term22 = varInd1;
term11dependent = term11;
term21dependent = term21;
if (term21 instanceof ImageInt) {
if ((/*(ImageInt)*/
term21).containsTermRecursively(term11)) {
commonTerm = term11;
}
if (term11 instanceof ImageInt && commonTerm == null && term21 instanceof ImageInt) {
commonTerm = ((ImageInt) term11).getTheOtherComponent();
if (!(term21.containsTermRecursively(commonTerm))) {
commonTerm = null;
}
if ((commonTerm == null) || !(term21).containsTermRecursively(commonTerm)) {
commonTerm = ((ImageInt) term21).getTheOtherComponent();
if ((commonTerm == null) || !(term11).containsTermRecursively(commonTerm)) {
commonTerm = null;
}
}
}
if (commonTerm != null) {
subs.put(commonTerm, varInd2);
term21 = ((CompoundTerm) term21).applySubstitute(subs);
if (!(term11 instanceof CompoundTerm)) {
term11 = varInd2;
} else {
term11 = ((CompoundTerm) term11).applySubstitute(subs);
}
}
}
if (commonTerm == null && term11 instanceof ImageInt) {
if ((/*(ImageInt)*/
term11).containsTermRecursively(term21)) {
commonTerm = term21;
}
if (term21 instanceof ImageInt && commonTerm == null && term11 instanceof ImageInt) {
commonTerm = ((ImageInt) term21).getTheOtherComponent();
if (!(term11.containsTermRecursively(commonTerm))) {
commonTerm = null;
}
if ((commonTerm == null) || !(term11).containsTermRecursively(commonTerm)) {
commonTerm = ((ImageInt) term11).getTheOtherComponent();
if ((commonTerm == null) || !(term21).containsTermRecursively(commonTerm)) {
commonTerm = null;
}
}
}
if (commonTerm != null) {
subs.put(commonTerm, varInd2);
term11 = ((CompoundTerm) term11).applySubstitute(subs);
if (!(term21 instanceof CompoundTerm)) {
term21 = varInd2;
} else {
term21 = ((CompoundTerm) term21).applySubstitute(subs);
}
}
}
}
Statement state1 = Inheritance.make(term11, term12);
Statement state2 = Inheritance.make(term21, term22);
Term content = Implication.make(state1, state2);
if (content == null) {
return;
}
TruthValue truthT = nal.getCurrentTask().sentence.truth;
TruthValue truthB = nal.getCurrentBelief().truth;
if ((truthT == null) || (truthB == null)) {
if (Parameters.DEBUG) {
System.out.println("ERROR: Belief with null truth value. (introVarOuter)");
}
return;
}
TruthValue truth = induction(truthT, truthB);
BudgetValue budget = BudgetFunctions.compoundForward(truth, content, nal);
nal.doublePremiseTask(content, truth, budget, false, false);
content = Implication.make(state2, state1);
truth = induction(truthB, truthT);
budget = BudgetFunctions.compoundForward(truth, content, nal);
nal.doublePremiseTask(content, truth, budget, false, false);
content = Equivalence.make(state1, state2);
truth = comparison(truthT, truthB);
budget = BudgetFunctions.compoundForward(truth, content, nal);
nal.doublePremiseTask(content, truth, budget, false, false);
Variable varDep = new Variable("#varDep");
if (index == 0) {
state1 = Inheritance.make(varDep, term12dependent);
state2 = Inheritance.make(varDep, term22dependent);
} else {
state1 = Inheritance.make(term11dependent, varDep);
state2 = Inheritance.make(term21dependent, varDep);
}
if ((state1 == null) || (state2 == null))
return;
content = Conjunction.make(state1, state2);
truth = intersection(truthT, truthB);
budget = BudgetFunctions.compoundForward(truth, content, nal);
nal.doublePremiseTask(content, truth, budget, false, false);
}
use of nars.language.Term in project opennars by opennars.
the class LocalRules method inferToSym.
/* -------------------- two-premise inference rules -------------------- */
/**
* {<S --> P>, <P --> S} |- <S <-> p> Produce Similarity/Equivalence from a
* pair of reversed Inheritance/Implication
*
* @param judgment1 The first premise
* @param judgment2 The second premise
* @param nal Reference to the memory
*/
private static void inferToSym(Sentence judgment1, Sentence judgment2, DerivationContext nal) {
Statement s1 = (Statement) judgment1.term;
Term t1 = s1.getSubject();
Term t2 = s1.getPredicate();
Term content;
if (s1 instanceof Inheritance) {
content = Similarity.make(t1, t2);
} else {
content = Equivalence.make(t1, t2, s1.getTemporalOrder());
}
TruthValue value1 = judgment1.truth;
TruthValue value2 = judgment2.truth;
TruthValue truth = TruthFunctions.intersection(value1, value2);
BudgetValue budget = BudgetFunctions.forward(truth, nal);
// (allow overlap) but not needed here, isn't detachment
nal.doublePremiseTask(content, truth, budget, false, false);
}
use of nars.language.Term in project opennars by opennars.
the class RuleTables method compoundAndStatement.
/**
* Inference between a compound term and a statement
*
* @param compound The compound term
* @param index The location of the current term in the compound
* @param statement The statement
* @param side The location of the current term in the statement
* @param beliefTerm The content of the belief
* @param nal Reference to the memory
*/
private static void compoundAndStatement(CompoundTerm compound, short index, Statement statement, short side, Term beliefTerm, DerivationContext nal) {
if (index >= compound.term.length) {
return;
}
Term component = compound.term[index];
Task task = nal.getCurrentTask();
if (component.getClass() == statement.getClass()) {
if ((compound instanceof Conjunction) && (nal.getCurrentBelief() != null)) {
Conjunction conj = (Conjunction) compound;
Term[] u = new Term[] { compound, statement };
if (Variables.unify(VAR_DEPENDENT, component, statement, u)) {
compound = (Conjunction) u[0];
statement = (Statement) u[1];
if (// only allow dep var elimination
conj.isSpatial || compound.getTemporalOrder() != TemporalRules.ORDER_FORWARD || index == 0) {
// for (&/ on first component!!
SyllogisticRules.elimiVarDep(compound, component, statement.equals(beliefTerm), nal);
}
} else if (task.sentence.isJudgment()) {
// && !compound.containsTerm(component)) {
CompositionalRules.introVarInner(statement, (Statement) component, compound, nal);
}
}
} else {
if (task.sentence.isJudgment()) {
if (statement instanceof Inheritance) {
StructuralRules.structuralCompose1(compound, index, statement, nal);
if (!(compound instanceof SetExt || compound instanceof SetInt || compound instanceof Negation)) {
StructuralRules.structuralCompose2(compound, index, statement, side, nal);
}
// {A --> B, A @ (A&C)} |- (A&C) --> (B&C)
} else if ((statement instanceof Similarity) && !(compound instanceof Conjunction)) {
StructuralRules.structuralCompose2(compound, index, statement, side, nal);
}
// {A <-> B, A @ (A&C)} |- (A&C) <-> (B&C)
}
}
}
Aggregations