All Downloads are FREE. Search and download functionalities are using the official Maven repository.

astra.statement.ForAll Maven / Gradle / Ivy

package astra.statement;

import astra.core.Intention;
import astra.reasoner.util.ContextEvaluateVisitor;
import astra.term.ListTerm;
import astra.term.Term;
import astra.term.Variable;

public class ForAll extends AbstractStatement {
	Variable variable;
	Term list;
	Statement body;
	
	public ForAll(String clazz, int[] data, Variable variable, Term list, Statement body) {
		this.setLocation(clazz, data[0], data[1], data[2], data[3]);
		this.variable = variable;
		this.list = list;
		this.body = body;
	}
	
	@Override
	public StatementHandler getStatementHandler() {
		return new AbstractStatementHandler() {
			int index = 0;
			ListTerm l;
			
			@Override
			public boolean execute(Intention intention) {
				if (index == 0) {
					Object obj = list.accept(new ContextEvaluateVisitor(intention));
					if (obj instanceof ListTerm) {
						l = (ListTerm) obj;
					} else {
						intention.failed("Second argument of forall is not a list.");
						return false;
					}
				}
				
				if (index < l.size()) {
					executor.addStatement(body.getStatementHandler());
					executor.addVariable(variable, l.get(index++));
					return true;
				}
				
				executor.removeVariable(variable);
				return false;
			}

			@Override
			public boolean onFail(Intention context) {
				return false;
			}

			@Override
			public Statement statement() {
				return ForAll.this;
			}
			
		};
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy