package nars.plugin.misc;
import nars.util.EventEmitter.EventObserver;
import nars.util.Events;
import nars.storage.Memory;
import nars.NAR;
import nars.util.Plugin;
import nars.entity.BudgetValue;
import nars.entity.Sentence;
import nars.entity.Stamp;
import nars.entity.Task;
import nars.entity.TruthValue;
import nars.io.Symbols;
import nars.language.Inheritance;
import nars.language.Product;
import nars.language.SetExt;
import nars.language.Term;
import nars.plugin.mental.InternalExperience;
/**
* Counting and Cardinality
*/
public class Counting implements Plugin {
public EventObserver obs;
final static Term CARDINALITY = Term.get("CARDINALITY");
@Override public boolean setEnabled(NAR n, boolean enabled) {
Memory memory = n.memory;
if(obs==null) {
obs=new EventObserver() {
@Override
public void event(Class event, Object[] a) {
if ((event!=Events.TaskDerive.class && event!=Events.TaskAdd.class))
return;
Task task = (Task)a[0];
if(task.budget.summary() < InternalExperience.MINIMUM_BUDGET_SUMMARY_TO_CREATE) {
return;
}
if(task.sentence.punctuation==Symbols.JUDGMENT_MARK) {
//lets say we have <{...} --> M>.
if(task.sentence.term instanceof Inheritance) {
Inheritance inh=(Inheritance) task.sentence.term;
if(inh.getSubject() instanceof SetExt) {
SetExt set_term=(SetExt) inh.getSubject();
//this gets the cardinality of M
int cardinality=set_term.size();
//now create term <(*,M,cardinality) --> CARDINALITY>.
Term[] product_args = new Term[] {
inh.getPredicate(),
Term.get(cardinality)
};
//TODO CARDINATLITY can be a static final instance shared by all
Term new_term=Inheritance.make(new Product(product_args), /* --> */ CARDINALITY);
if (new_term == null) {
//this usually happens when product_args contains the term CARDINALITY in which case it is an invalid Inheritance statement
return;
}
TruthValue truth = task.sentence.truth.clone();
Stamp stampi = task.sentence.stamp.clone();
Sentence j = new Sentence(new_term, Symbols.JUDGMENT_MARK, truth, stampi);
BudgetValue budg = task.budget.clone();
Task newTask = new Task(j, budg,task);
memory.addNewTask(newTask, "Derived (Cardinality)");
}
}
}
}
};
}
memory.event.set(obs, enabled, Events.TaskDerive.class);
return true;
}
}