/* * 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"); } }