package org.archstudio.prolog.op.iso; import java.util.Iterator; import java.util.List; import java.util.Map; import org.archstudio.prolog.engine.PrologUtils; import org.archstudio.prolog.engine.ProofContext; import org.archstudio.prolog.engine.UnificationEngine; import org.archstudio.prolog.op.Executable; import org.archstudio.prolog.term.ComplexTerm; import org.archstudio.prolog.term.Term; import org.archstudio.prolog.term.VariableTerm; public class Disjunction extends ComplexTerm implements Executable { public Disjunction(String name, List<? extends Term> terms) { super(name, 2, terms); } @Override public Iterable<Map<VariableTerm, Term>> execute(final ProofContext proofContext, final UnificationEngine unificationEngine, Term source, final Map<VariableTerm, Term> variables) { if (getTerm(0) instanceof IfThen) { // special case for IF-THEN-ELSE, A -> B ; C Executable term0if = PrologUtils.resolveExecutable(proofContext, ((IfThen) getTerm(0)).getTerm(0), variables); Iterator<Map<VariableTerm, Term>> term0Variables = term0if.execute(proofContext, unificationEngine, term0if, variables).iterator(); if (term0Variables.hasNext()) { Executable term0then = PrologUtils.resolveExecutable(proofContext, ((IfThen) getTerm(0)).getTerm(1), variables); return term0then.execute(proofContext, unificationEngine, term0then, term0Variables.next()); } } else { Executable term0 = PrologUtils.resolveExecutable(proofContext, getTerm(0), variables); Iterable<Map<VariableTerm, Term>> term0Variables = term0.execute(proofContext, unificationEngine, term0, variables); if (term0Variables.iterator().hasNext()) { return term0Variables; } } Executable term1 = PrologUtils.resolveExecutable(proofContext, getTerm(1), variables); return term1.execute(proofContext, unificationEngine, term1, variables); } }