package org.jactr.modules.threaded.procedural; /* * default logging */ import java.util.Collection; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.module.procedural.six.DefaultProductionInstantiator; import org.jactr.core.production.CannotInstantiateException; import org.jactr.core.production.IInstantiation; import org.jactr.core.production.IProduction; import org.jactr.core.production.VariableBindings; /** * removes candidate bindings that include that same chunk in goal and * other-goal * * @author harrison */ public class CullingProductionInstantiator extends DefaultProductionInstantiator { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(CullingProductionInstantiator.class); @Override public Collection<IInstantiation> instantiate(IProduction production, Collection<VariableBindings> provisionalBindings) throws CannotInstantiateException { Iterator<VariableBindings> itr = provisionalBindings.iterator(); while (itr.hasNext()) { VariableBindings bindings = itr.next(); if (bindings.isBound("=goal") && bindings.isBound("=other-goal") && bindings.get("=goal") == bindings.get("=other-goal")) { if (LOGGER.isDebugEnabled()) LOGGER.debug(String.format( "Rejecting instantiation of %s with goal/other-goal match (%s)", production, bindings.get("=goal"))); itr.remove(); } } if (provisionalBindings.size() == 0) throw new CannotInstantiateException( "Only self-referential bindings found (=goal/=other-goal). Cannot instantiate."); return super.instantiate(production, provisionalBindings); } }