/*
* Here comes the text of your license
* Each line should be prefixed with *
*/
package nars.operator.misc;
import nars.storage.Memory;
import nars.language.CompoundTerm;
import nars.language.Inheritance;
import nars.language.Product;
import nars.language.Similarity;
import nars.language.Statement;
import nars.language.Term;
import nars.operator.SynchronousFunctionOperator;
import nars.operator.SynchronousFunctionOperator;
/**
* Produces canonical "Reflective-Narsese" representation of a parameter term
* @author me
*/
public class Reflect extends SynchronousFunctionOperator {
/*
<(*,<(*,good,property) --> inheritance>,(&&,<(*,human,good) --> product>,<(*,(*,human,good),inheritance) --> inheritance>)) --> conjunction>.
*/
public Reflect() {
super("^reflect");
}
final static String requireMessage = "Requires 1 Term argument";
@Override
protected Term function(Memory memory, Term[] x) {
if (x.length!=1) {
throw new RuntimeException(requireMessage);
}
Term content = x[0];
return getMetaTerm(content);
}
/**
* <(*,subject,object) --> predicate>
*/
public static Term sop(Term subject, Term object, Term predicate) {
return Inheritance.make(Product.make(getMetaTerm(subject),getMetaTerm(object)), predicate);
}
public static Term sop(Statement s, String operatorName) {
return Inheritance.make(Product.make(getMetaTerm(s.getSubject()),getMetaTerm(s.getPredicate())), Term.get(operatorName));
}
public static Term sop(Statement s, Term predicate) {
return Inheritance.make(Product.make(getMetaTerm(s.getSubject()),getMetaTerm(s.getPredicate())), predicate);
}
public static Term sop(String operatorName, Term... t) {
Term[] m = new Term[t.length];
int i = 0;
for (Term x : t)
m[i++] = getMetaTerm(x);
return Inheritance.make(Product.make(m), Term.get(operatorName));
}
public static Term getMetaTerm(Term node) {
if (!(node instanceof CompoundTerm)) {
return node;
}
CompoundTerm t = (CompoundTerm)node;
switch (t.operator()) {
case INHERITANCE: return sop((Inheritance)t, "inheritance");
case SIMILARITY: return sop((Similarity)t, "similarity");
default: return sop(t.operator().toString(), t.term);
}
}
@Override
protected Term getRange() {
return Term.get("reflect");
}
}