diff --git a/build.gradle b/build.gradle index 205642b5ddc596bef7f8ca1338034bc4c8114a79..33b77a6710bc05ca7ef1d25d8b8e5fa151413695 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ // to trigger a full tycho build please use 'gradle deleteFromClassPath completeInstall' - +import org.apache.tools.ant.taskdefs.condition.Os project.ext{ @@ -101,6 +101,53 @@ task downloadCli << { } + +task downloadCli2 ( type: Exec ) { + + def dir = workspacePath+'de.prob.core/prob/' + delete file(dir) + new File(dir).mkdirs() + + ['leopard64':'macos','linux':'linux','linux64':'linux64','win32':'windows'].each { + def n = it.getKey() + + def targetdir = dir+it.getValue() + def targetzip = dir+"probcli_${n}.zip" + def url = "http://nightly.cobra.cs.uni-duesseldorf.de/cli/probcli_${n}.zip" + download(url,targetzip) + FileTree zip = zipTree(targetzip) + copy { + from zip + into targetdir + } + delete file(targetzip) + } + + def targetdir = dir+"windows/" + def targetzip = targetdir+"windowslib.zip" + download("http://nightly.cobra.cs.uni-duesseldorf.de/cli/windowslib.zip",targetzip) + FileTree zip = zipTree(targetzip) + copy { + from zip + into targetdir + } + delete file(targetzip) + + ['leopard64':'macos','linux32':'linux','linux64':'linux64'].each { + + def n = it.getKey() + targetdir = dir+it.getValue() + + download( "http://nightly.cobra.cs.uni-duesseldorf.de/cspm/cspm-"+n, targetdir+"/cspm" ) + } + commandLine 'chmod', 'a+x', dir+'linux'+'/cspm', dir+'linux64'+'/cspm', dir+'macos'+'/cspm' + //commandLine 'chmod', 'a+x', dir+'*'+'/cspm' + + download( "http://nightly.cobra.cs.uni-duesseldorf.de/cspm/cspm-windows", dir+"windows"+"/cspm.exe" ) +} + + + completeInstall.dependsOn downloadCli completeInstall.dependsOn subprojects.setClassPath diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath index bb1ae0592818db067d6599e1a8f034a51349b613..b5efa8550ac9c4daefb09ca828889085b018d941 100644 --- a/de.prob.core/.classpath +++ b/de.prob.core/.classpath @@ -4,20 +4,20 @@ <classpathentry exported="true" kind="lib" path="lib/dependencies/xmlpull-1.1.3.1.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/xpp3_min-1.1.4c.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/xstream-1.4.3.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.8-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.8-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.8-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-lang-2.6.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/jgrapht-0.8.3.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.8-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.8-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.8-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.8-SNAPSHOT.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="test"/> <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.12-SNAPSHOT.jar"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/de.prob.core/META-INF/MANIFEST.MF b/de.prob.core/META-INF/MANIFEST.MF index b68f1d0afc2a00b39086b6c5c55bff7f6296a9c2..f294dd34c178468f36b26bcd9d7c232658361103 100644 --- a/de.prob.core/META-INF/MANIFEST.MF +++ b/de.prob.core/META-INF/MANIFEST.MF @@ -70,7 +70,6 @@ Export-Package: com.thoughtworks.xstream, de.prob.core.domainobjects, de.prob.core.domainobjects.eval, de.prob.core.domainobjects.ltl, - de.prob.core.domainobjects.ltl.unittests, de.prob.core.internal, de.prob.core.langdep, de.prob.core.prolog, @@ -119,11 +118,11 @@ Bundle-ClassPath: ., lib/dependencies/bparser-2.4.12-SNAPSHOT.jar, lib/dependencies/cliparser-2.4.12-SNAPSHOT.jar, lib/dependencies/commons-codec-1.6.jar, + lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar, lib/dependencies/commons-lang-2.6.jar, lib/dependencies/jgrapht-0.8.3.jar, lib/dependencies/jsr305-1.3.9.jar, lib/dependencies/ltlparser-2.4.12-SNAPSHOT.jar, - lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar, lib/dependencies/prologlib-2.4.12-SNAPSHOT.jar, lib/dependencies/unicode-2.4.12-SNAPSHOT.jar, lib/dependencies/xmlpull-1.1.3.1.jar, diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java index 9ea99009688c58a066ad0add611d91b1e6a429a6..ad5b33afb304accdbaa9f275db0e8a47d91b6707 100644 --- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java @@ -13,11 +13,10 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.Assert; -import org.eventb.core.IAxiom; import org.eventb.core.IContextRoot; import org.eventb.core.IExtendsContext; +import org.eventb.core.ILabeledElement; import org.eventb.core.IPOSequent; import org.eventb.core.IPOSource; import org.eventb.core.IPSRoot; @@ -54,8 +53,9 @@ import de.be4.classicalb.core.parser.node.PSet; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.hhu.stups.sablecc.patch.SourcePosition; import de.prob.core.translator.TranslationFailedException; -import de.prob.eventb.translator.internal.DischargedProof; -import de.prob.logging.Logger; +import de.prob.eventb.translator.internal.EProofStatus; +import de.prob.eventb.translator.internal.ProofObligation; +import de.prob.eventb.translator.internal.SequentSource; public final class ContextTranslator extends AbstractComponentTranslator { @@ -63,16 +63,13 @@ public final class ContextTranslator extends AbstractComponentTranslator { private final ISCContext context; private final AEventBContextParseUnit model = new AEventBContextParseUnit(); private final Map<String, ISCContext> depContext = new HashMap<String, ISCContext>(); - private final List<DischargedProof> proofs = new ArrayList<DischargedProof>(); + private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); private final List<ClassifiedPragma> proofspragmas = new ArrayList<ClassifiedPragma>(); - private final FormulaFactory ff; - private ITypeEnvironment te; public static ContextTranslator create(final ISCContext context) throws TranslationFailedException { ContextTranslator contextTranslator = new ContextTranslator(context); try { - (new TheoryTranslator()).translate(); contextTranslator.translate(); } catch (RodinDBException e) { final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: "; @@ -95,21 +92,12 @@ public final class ContextTranslator extends AbstractComponentTranslator { private ContextTranslator(final ISCContext context) throws TranslationFailedException { this.context = context; - ff = ((ISCContextRoot) context).getFormulaFactory(); - try { - te = ((ISCContextRoot) context).getTypeEnvironment(ff); - } catch (RodinDBException e) { - final String message = "A Rodin exception occured during translation process. Original Exception: "; - throw new TranslationFailedException(context.getComponentName(), - message + e.getLocalizedMessage()); - } } private void translate() throws RodinDBException { if (context instanceof ISCContextRoot) { ISCContextRoot context_root = (ISCContextRoot) context; Assert.isTrue(context_root.getRodinFile().isConsistent()); - te = context_root.getTypeEnvironment(ff); } else if (context instanceof ISCInternalContext) { ISCInternalContext context_internal = (ISCInternalContext) context; @@ -136,10 +124,10 @@ public final class ContextTranslator extends AbstractComponentTranslator { } - private void collectProofInfo(ISCContextRoot context_root) + private void collectProofInfo(ISCContextRoot origin) throws RodinDBException { - IPSRoot proofStatus = context_root.getPSRoot(); + IPSRoot proofStatus = origin.getPSRoot(); IPSStatus[] statuses = proofStatus.getStatuses(); List<String> bugs = new LinkedList<String>(); @@ -147,34 +135,37 @@ public final class ContextTranslator extends AbstractComponentTranslator { for (IPSStatus status : statuses) { final int confidence = status.getConfidence(); boolean broken = status.isBroken(); - if (!broken && confidence == IConfidence.DISCHARGED_MAX) { - IPOSequent sequent = status.getPOSequent(); - IPOSource[] sources = sequent.getSources(); - - for (IPOSource source : sources) { - - IRodinElement srcElement = source.getSource(); - if (!srcElement.exists()) { - bugs.add(status.getElementName()); - break; - } - - if (srcElement instanceof IAxiom) { - IAxiom tmp = (IAxiom) srcElement; - if (((IContextRoot) tmp.getParent()) - .equals(context_root.getContextRoot())) { - proofs.add(new DischargedProof(context_root, tmp, - null)); - } - } + + EProofStatus pstatus = EProofStatus.UNPROVEN; + + if (!broken && confidence == IConfidence.REVIEWED_MAX) + pstatus = EProofStatus.REVIEWED; + if (!broken && confidence == IConfidence.DISCHARGED_MAX) + pstatus = EProofStatus.PROVEN; + + IPOSequent sequent = status.getPOSequent(); + IPOSource[] sources = sequent.getSources(); + + String name = sequent.getDescription(); + + ArrayList<SequentSource> s = new ArrayList<SequentSource>( + sources.length); + for (IPOSource source : sources) { + + IRodinElement srcElement = source.getSource(); + if (!srcElement.exists() + || !(srcElement instanceof ILabeledElement)) { + bugs.add(status.getElementName()); + break; } - } - } - if (!bugs.isEmpty()) { - String message = "Translation incomplete due to a Bug in Rodin. This does not affect correctness of the Animation/Model Checking but can decrease its performance. Skipped discharged information about: " - + StringUtils.join(bugs, ","); - Logger.notifyUser(message); + ILabeledElement le = (ILabeledElement) srcElement; + + s.add(new SequentSource(srcElement.getElementType(), le + .getLabel())); + + } + proofs.add(new ProofObligation(origin, s, name, pstatus)); } } @@ -319,6 +310,8 @@ public final class ContextTranslator extends AbstractComponentTranslator { } final PredicateVisitor visitor = new PredicateVisitor( new LinkedList<String>()); + final FormulaFactory ff = FormulaFactory.getDefault(); + final ITypeEnvironment te = ff.makeTypeEnvironment(); element.getPredicate(ff, te).accept(visitor); final PPredicate predicate = visitor.getPredicate(); list.add(predicate); @@ -330,7 +323,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { return list; } - public List<DischargedProof> getProofs() { + public List<ProofObligation> getProofs() { return proofs; } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EProofStatus.java b/de.prob.core/src/de/prob/eventb/translator/internal/EProofStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..160bf968ce3bd637dea4af99e8b5eea6ee72fd8f --- /dev/null +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EProofStatus.java @@ -0,0 +1,15 @@ +package de.prob.eventb.translator.internal; + +public enum EProofStatus { + UNPROVEN("false"), PROVEN("true"), REVIEWED("reviewed"); + private final String text; + + private EProofStatus(String text) { + this.text = text; + } + + @Override + public String toString() { + return text; + } +} diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java index 43ea5792f26eee7de07938f106ef26696642a2c8..ed82d8a8e8ee13b70b2e191805fa67b5168c306b 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java @@ -11,13 +11,11 @@ import java.util.Collection; import java.util.Map; import org.eclipse.core.runtime.Assert; -import org.eventb.core.IEvent; import org.eventb.core.IEventBProject; import org.eventb.core.IEventBRoot; import org.eventb.core.ISCInternalContext; import org.eventb.core.ISCMachineRoot; import org.rodinp.core.IInternalElement; -import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog; import de.be4.classicalb.core.parser.node.AEventBContextParseUnit; @@ -27,16 +25,13 @@ import de.prob.core.translator.ITranslator; import de.prob.core.translator.TranslationFailedException; import de.prob.eventb.translator.AbstractComponentTranslator; import de.prob.eventb.translator.ContextTranslator; -import de.prob.eventb.translator.Theories; import de.prob.prolog.output.IPrologTermOutput; public abstract class EventBTranslator implements ITranslator { protected final IEventBProject project; - private final String name; protected EventBTranslator(final IEventBRoot root) { this.project = root.getEventBProject(); - this.name = root.getComponentName(); } // another constructor to cater for ISCInternalContext (which is not a root @@ -44,7 +39,6 @@ public abstract class EventBTranslator implements ITranslator { protected EventBTranslator(final ISCInternalContext ctx) { Assert.isTrue(ctx.getRoot() instanceof ISCMachineRoot); this.project = ((ISCMachineRoot) ctx.getRoot()).getEventBProject(); - this.name = ctx.getComponentName(); } private LabelPositionPrinter createPrinter( @@ -89,7 +83,7 @@ public abstract class EventBTranslator implements ITranslator { Collection<ContextTranslator> contextTranslators, final IPrologTermOutput pout) throws TranslationFailedException { - ArrayList<DischargedProof> list = new ArrayList<DischargedProof>(); + ArrayList<ProofObligation> list = new ArrayList<ProofObligation>(); for (ContextTranslator contextTranslator : contextTranslators) { list.addAll(contextTranslator.getProofs()); @@ -98,20 +92,19 @@ public abstract class EventBTranslator implements ITranslator { list.addAll(modelTranslator.getProofs()); } - for (DischargedProof proof : list) { - pout.openTerm("discharged"); - pout.printAtom(proof.machine.getRodinFile().getBareName()); - try { - IEvent event = proof.event; - final String elementName = proof.predicate; - if (event != null) - pout.printAtom(event.getLabel()); - pout.printAtom(elementName); - } catch (RodinDBException e) { - final String details = "Translation error while getting information about discharged proof obligations"; - throw new TranslationFailedException(name, details); + for (ProofObligation proof : list) { + pout.openTerm("po"); + pout.printAtom(proof.origin.getRodinFile().getBareName()); + pout.printAtom(proof.kind); + pout.openList(); + for (SequentSource source : proof.sources) { + pout.openTerm(source.type); + pout.printAtom(source.label); + pout.closeTerm(); } + pout.closeList(); + pout.printAtom(proof.discharged.toString()); pout.closeTerm(); } @@ -142,6 +135,9 @@ public abstract class EventBTranslator implements ITranslator { printModels(refinementChainTranslators, pout, prolog); printContexts(contextTranslators, pout, prolog); pout.openList(); + pout.openTerm("exporter_version"); + pout.printNumber(2); + pout.closeTerm(); printProofInformation(refinementChainTranslators, contextTranslators, pout); // FIXME THEORY-PLUGIN re-enable when the theory plugin was released diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java index d9fdf6fbb66e8880d7577915fe8fc80d36a17c87..ead67da6ba447b4f830418088f54eb34069a3bf7 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java @@ -15,8 +15,7 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import org.eventb.core.IConvergenceElement.Convergence; -import org.eventb.core.IEvent; -import org.eventb.core.IInvariant; +import org.eventb.core.ILabeledElement; import org.eventb.core.IMachineRoot; import org.eventb.core.IPOSequent; import org.eventb.core.IPOSource; @@ -40,6 +39,7 @@ import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; import org.eventb.core.ast.Predicate; import org.eventb.core.seqprover.IConfidence; +import org.rodinp.core.IElementType; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; import org.rodinp.core.RodinDBException; @@ -80,7 +80,7 @@ public class ModelTranslator extends AbstractComponentTranslator { private final FormulaFactory ff; private final ITypeEnvironment te; private final IMachineRoot origin; - private final List<DischargedProof> proofs = new ArrayList<DischargedProof>(); + private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); // private final List<String> depContext = new ArrayList<String>(); // Confined in the thread calling the factory method @@ -113,7 +113,7 @@ public class ModelTranslator extends AbstractComponentTranslator { return modelTranslator; } - public List<DischargedProof> getProofs() { + public List<ProofObligation> getProofs() { return Collections.unmodifiableList(proofs); } @@ -176,41 +176,37 @@ public class ModelTranslator extends AbstractComponentTranslator { for (IPSStatus status : statuses) { final int confidence = status.getConfidence(); boolean broken = status.isBroken(); - if (!broken && confidence == IConfidence.DISCHARGED_MAX) { - IPOSequent sequent = status.getPOSequent(); - IPOSource[] sources = sequent.getSources(); - - IEvent evt = null; - IInvariant inv = null; - - for (IPOSource source : sources) { - - IRodinElement srcElement = source.getSource(); - if (!srcElement.exists()) { - bugs.add(status.getElementName()); - break; - } - - if (srcElement instanceof IEvent) { - IEvent tmp = (IEvent) srcElement; - if (((IMachineRoot) tmp.getParent()).equals(origin)) { - evt = tmp; - } - } - if (srcElement instanceof IInvariant) { - IInvariant tmp = (IInvariant) srcElement; - if (((IMachineRoot) tmp.getParent()).equals(origin)) { - inv = tmp; - } - } - } - if (evt != null && inv != null) { - proofs.add(new DischargedProof(origin, inv, evt)); - } - if (evt == null && inv != null && inv.isTheorem()) { - proofs.add(new DischargedProof(origin, inv, evt)); + + EProofStatus pstatus = EProofStatus.UNPROVEN; + + if (!broken && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX)) + pstatus = EProofStatus.REVIEWED; + if (!broken && confidence == IConfidence.DISCHARGED_MAX) + pstatus = EProofStatus.PROVEN; + + IPOSequent sequent = status.getPOSequent(); + IPOSource[] sources = sequent.getSources(); + + String name = sequent.getDescription(); + + ArrayList<SequentSource> s = new ArrayList<SequentSource>( + sources.length); + for (IPOSource source : sources) { + + IRodinElement srcElement = source.getSource(); + if (!srcElement.exists() + || !(srcElement instanceof ILabeledElement)) { + bugs.add(status.getElementName()); + break; } + + ILabeledElement le = (ILabeledElement) srcElement; + IElementType<? extends IRodinElement> type = srcElement + .getElementType(); + s.add(new SequentSource(type, le.getLabel())); + } + proofs.add(new ProofObligation(origin, s, name, pstatus)); } if (!bugs.isEmpty()) { diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ProofObligation.java b/de.prob.core/src/de/prob/eventb/translator/internal/ProofObligation.java new file mode 100644 index 0000000000000000000000000000000000000000..39b10069a3de8357e334a8f218384ae907ea96ae --- /dev/null +++ b/de.prob.core/src/de/prob/eventb/translator/internal/ProofObligation.java @@ -0,0 +1,22 @@ +package de.prob.eventb.translator.internal; + +import java.util.ArrayList; + +import org.eventb.core.IEventBRoot; + +public class ProofObligation { + + public final IEventBRoot origin; + public final ArrayList<SequentSource> sources; + public final String kind; + public final EProofStatus discharged; + + public ProofObligation(IEventBRoot origin, ArrayList<SequentSource> s, + String name, EProofStatus pstatus) { + this.origin = origin; + this.sources = s; + this.kind = name; + this.discharged = pstatus; + } + +} diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/SequentSource.java b/de.prob.core/src/de/prob/eventb/translator/internal/SequentSource.java new file mode 100644 index 0000000000000000000000000000000000000000..5575130fc9509990ab94e0aabc665cbceccc5740 --- /dev/null +++ b/de.prob.core/src/de/prob/eventb/translator/internal/SequentSource.java @@ -0,0 +1,17 @@ +package de.prob.eventb.translator.internal; + +import org.rodinp.core.IElementType; +import org.rodinp.core.IRodinElement; + +public class SequentSource { + + public final String type; + public final String label; + + public SequentSource(IElementType<? extends IRodinElement> type, + String label) { + this.type = type.toString().replaceAll("org.eventb.core.", ""); + this.label = label; + } + +}