diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java index 09429937cafc3f3e0807be627dc3fa63ca1ba340..1d40ffa2b6cd31b0d5ea8dd0f51ae7c6b6edf408 100644 --- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java +++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java @@ -2,11 +2,14 @@ package de.prob.eventb.disprover.core.internal; import java.util.Set; +import org.eclipse.core.runtime.jobs.Job; import org.eventb.core.IEventBRoot; import org.eventb.core.ast.Predicate; +import org.eventb.core.seqprover.IProofMonitor; import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog; import de.prob.core.Animator; +import de.prob.core.ProBCommandJob; import de.prob.core.command.ClearMachineCommand; import de.prob.core.command.CommandException; import de.prob.core.command.ComposedCommand; @@ -48,8 +51,8 @@ public class DisproverCommand implements IComposableCommand { } public static ICounterExample disprove(Animator animator, - Set<Predicate> hypotheses, Predicate goal, IEventBRoot root) - throws ProBException { + Set<Predicate> hypotheses, Predicate goal, IEventBRoot root, + IProofMonitor pm) throws ProBException, InterruptedException { final ClearMachineCommand clear = new ClearMachineCommand(); final SetPreferencesCommand setPrefs = SetPreferencesCommand @@ -63,9 +66,20 @@ public class DisproverCommand implements IComposableCommand { final ComposedCommand composed = new ComposedCommand(clear, setPrefs, load, start, disprove); - animator.execute(composed); + final Job job = new ProBCommandJob("Disproving", animator, composed); + job.setUser(true); + job.schedule(); + while (job.getResult() == null && !pm.isCanceled()) { + Thread.sleep(200); + } + + if (pm.isCanceled()) { + job.cancel(); + throw new InterruptedException(); + } return disprove.getResult(); + } private ICounterExample getResult() { @@ -107,6 +121,9 @@ public class DisproverCommand implements IComposableCommand { if ("time_out".equals(term.getFunctor())) { counterExample = new CounterExample(true, true); } + if ("interrupted".equals(term.getFunctor())) { + throw new CommandException("Interrupted"); + } if ("no_solution_found".equals(term.getFunctor())) { counterExample = new CounterExample(false, false); } diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java index 0d92a9fce10f6a4cb8d62ef811fefb02ffefbc10..68ff440235b4b69327fcf8c3a20cb15087c9bade 100644 --- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java +++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java @@ -51,7 +51,7 @@ public class DisproverReasoner implements IReasoner { final IReasonerInput input, final IProofMonitor pm) { try { DisproverReasonerInput disproverInput = (DisproverReasonerInput) input; - ICounterExample ce = evaluateSequent(sequent, disproverInput); + ICounterExample ce = evaluateSequent(sequent, disproverInput, pm); return createDisproverResult(ce, sequent, input); } catch (PrologException e) { Logger.log(Logger.WARNING, Status.WARNING, e.getMessage(), e); @@ -62,12 +62,15 @@ public class DisproverReasoner implements IReasoner { } catch (RodinDBException e) { Logger.log(Logger.WARNING, Status.WARNING, e.getMessage(), e); return ProverFactory.reasonerFailure(this, input, e.getMessage()); + } catch (InterruptedException e) { + return ProverFactory.reasonerFailure(this, input, e.getMessage()); + } } private ICounterExample evaluateSequent(final IProverSequent sequent, - final DisproverReasonerInput disproverInput) throws ProBException, - RodinDBException { + final DisproverReasonerInput disproverInput, IProofMonitor pm) + throws ProBException, RodinDBException, InterruptedException { Set<Predicate> hypotheses = new HashSet<Predicate>(); for (Predicate predicate : sequent.hypIterable()) { @@ -77,7 +80,7 @@ public class DisproverReasoner implements IReasoner { IEventBRoot root = getRoot(sequent); ICounterExample counterExample = DisproverCommand.disprove( - Animator.getAnimator(), hypotheses, goal, root); + Animator.getAnimator(), hypotheses, goal, root, pm); return counterExample; }