Skip to content
Snippets Groups Projects
Commit c72d3678 authored by dgelessus's avatar dgelessus
Browse files

Add :browse command to view the current state (#15)

parent 969e8e9f
No related branches found
No related tags found
No related merge requests found
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
:help :browse
```
%% Output
:browse
Show information about the current state
%% Cell type:code id: tags:
``` prob
:help :exec :help :exec
``` ```
%% Output %% Output
:exec OPERATION [PREDICATE] :exec OPERATION [PREDICATE]
Execute an operation with the specified predicate Execute an operation with the specified predicate
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
:browse
```
%% Output
Machine: repl
Sets: (none)
Constants: (none)
Variables: (none)
Operations: (none)
%% Cell type:code id: tags:
``` prob
::load ::load
MACHINE Counter MACHINE Counter
VARIABLES value VARIABLES value
INVARIANT value : MININT..MAXINT INVARIANT value : MININT..MAXINT
INITIALISATION value :: MININT..MAXINT INITIALISATION value :: MININT..MAXINT
OPERATIONS OPERATIONS
add(diff) = SELECT add(diff) = SELECT
value+diff : MININT..MAXINT value+diff : MININT..MAXINT
THEN THEN
value := value+diff value := value+diff
END END
END END
``` ```
%% Output %% Output
[2018-05-16 14:33:33,768, T+5453] "Shell-0" de.prob.cli.PrologProcessProvider.makeProcess(PrologProcessProvider.java:64): [INFO] Starting ProB's Prolog Core. Path is /Users/david/.prob/prob2-3.2.10-SNAPSHOT/probcli.sh [2018-05-16 15:24:23,150, T+8559] "Shell-0" de.prob.cli.PrologProcessProvider.makeProcess(PrologProcessProvider.java:64): [INFO] Starting ProB's Prolog Core. Path is /Users/david/.prob/prob2-3.2.10-SNAPSHOT/probcli.sh
[2018-05-16 14:33:35,223, T+6908] "Shell-0" de.prob.cli.PortPattern.setValue(PortPattern.java:30): [INFO] Server has started and listens on port 55956 [2018-05-16 15:24:24,859, T+10268] "Shell-0" de.prob.cli.PortPattern.setValue(PortPattern.java:30): [INFO] Server has started and listens on port 60969
[2018-05-16 14:33:35,225, T+6910] "Shell-0" de.prob.cli.InterruptRefPattern.setValue(InterruptRefPattern.java:29): [INFO] Server can receive user interrupts via reference 2510 [2018-05-16 15:24:24,860, T+10269] "Shell-0" de.prob.cli.InterruptRefPattern.setValue(InterruptRefPattern.java:29): [INFO] Server can receive user interrupts via reference 2734
[2018-05-16 14:33:35,228, T+6913] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] -- starting command loop -- [2018-05-16 15:24:24,866, T+10275] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] -- starting command loop --
[2018-05-16 14:33:35,251, T+6936] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] Connected: 127.0.0.1 [2018-05-16 15:24:24,881, T+10290] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] Connected: 127.0.0.1
[2018-05-16 14:33:35,524, T+7209] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] loading_classical_b(parser_version(2018-05-16 13:34:59.07),Counter,[/Users/Shared/Uni/SHK/ProB2/prob2-jupyter-kernel/notebooks/tests]) [2018-05-16 15:24:25,134, T+10543] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] loading_classical_b(parser_version(2018-05-16 13:34:59.07),Counter,[/Users/Shared/Uni/SHK/ProB2/prob2-jupyter-kernel/notebooks/tests])
Loaded machine: Counter : [] Loaded machine: Counter : []
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
:browse
```
%% Output
Machine: Counter
Sets: (none)
Constants: (none)
Variables: value
Operations: add(diff)
%% Cell type:code id: tags:
``` prob
value value
``` ```
%% Output %% Output
NOT-INITIALISED NOT-INITIALISED
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
:exec $initialise_machine value=2 :exec $initialise_machine value=2
``` ```
%% Output %% Output
[2018-05-16 14:33:35,862, T+7547] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO]  [2018-05-16 15:24:25,522, T+10931] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] 
[2018-05-16 14:33:35,863, T+7548] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] ALL OPERATIONS COVERED [2018-05-16 15:24:25,523, T+10932] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] ALL OPERATIONS COVERED
[2018-05-16 14:33:35,864, T+7549] "ProB Output Logger for instance 5f27dee3" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO]  [2018-05-16 15:24:25,524, T+10933] "ProB Output Logger for instance 5602ac4c" de.prob.cli.ProBInstance.readAndLog(ConsoleListener.java:48): [INFO] 
Executed operation $initialise_machine Executed operation $initialise_machine
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
value value
``` ```
%% Output %% Output
2 2
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
:exec add diff=-1 :exec add diff=-1
``` ```
%% Output %% Output
Executed operation add Executed operation add
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` prob ``` prob
value value
``` ```
%% Output %% Output
1 1
......
...@@ -21,6 +21,7 @@ import de.prob.statespace.AnimationSelector; ...@@ -21,6 +21,7 @@ import de.prob.statespace.AnimationSelector;
import de.prob.statespace.Trace; import de.prob.statespace.Trace;
import de.prob.unicode.UnicodeTranslator; import de.prob.unicode.UnicodeTranslator;
import de.prob2.jupyter.commands.BrowseCommand;
import de.prob2.jupyter.commands.CellCommand; import de.prob2.jupyter.commands.CellCommand;
import de.prob2.jupyter.commands.ExecCommand; import de.prob2.jupyter.commands.ExecCommand;
import de.prob2.jupyter.commands.GroovyCommand; import de.prob2.jupyter.commands.GroovyCommand;
...@@ -63,6 +64,7 @@ public final class ProBKernel extends BaseKernel { ...@@ -63,6 +64,7 @@ public final class ProBKernel extends BaseKernel {
this.lineCommands.put(":help", help); this.lineCommands.put(":help", help);
this.lineCommands.put(":load", injector.getInstance(LoadFileCommand.class)); this.lineCommands.put(":load", injector.getInstance(LoadFileCommand.class));
this.lineCommands.put(":pref", injector.getInstance(PrefCommand.class)); this.lineCommands.put(":pref", injector.getInstance(PrefCommand.class));
this.lineCommands.put(":browse", injector.getInstance(BrowseCommand.class));
this.lineCommands.put(":exec", injector.getInstance(ExecCommand.class)); this.lineCommands.put(":exec", injector.getInstance(ExecCommand.class));
this.lineCommands.put(":groovy", injector.getInstance(GroovyCommand.class)); this.lineCommands.put(":groovy", injector.getInstance(GroovyCommand.class));
......
package de.prob2.jupyter.commands;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.inject.Inject;
import de.prob.model.representation.AbstractElement;
import de.prob.model.representation.BEvent;
import de.prob.model.representation.Constant;
import de.prob.model.representation.Set;
import de.prob.model.representation.Variable;
import de.prob.statespace.AnimationSelector;
import de.prob.statespace.Trace;
import de.prob2.jupyter.ProBKernel;
import io.github.spencerpark.jupyter.messages.DisplayData;
import org.jetbrains.annotations.NotNull;
public final class BrowseCommand implements LineCommand {
private final @NotNull AnimationSelector animationSelector;
@Inject
private BrowseCommand(final @NotNull AnimationSelector animationSelector) {
super();
this.animationSelector = animationSelector;
}
@Override
public @NotNull String getSyntax() {
return ":browse";
}
@Override
public @NotNull String getShortHelp() {
return "Show information about the current state";
}
private static <T extends AbstractElement> @NotNull String elementsToString(
final @NotNull AbstractElement element,
final @NotNull Class<T> clazz,
final @NotNull Function<@NotNull T, @NotNull String> func
) {
final String elements = element.getChildrenOfType(clazz).stream().map(func).collect(Collectors.joining(", "));
return elements.isEmpty() ? "(none)" : elements;
}
@Override
public @NotNull DisplayData run(final @NotNull ProBKernel kernel, final @NotNull String name, final @NotNull String argString) {
if (!argString.isEmpty()) {
throw new CommandExecutionException(name, "Unexpected argument: " + argString);
}
final Trace trace = this.animationSelector.getCurrentTrace();
final StringBuilder sb = new StringBuilder("Machine: ");
final AbstractElement mainComponent = trace.getStateSpace().getMainComponent();
sb.append(mainComponent);
sb.append("\nSets: ");
sb.append(elementsToString(mainComponent, Set.class, Set::getName));
sb.append("\nConstants: ");
sb.append(elementsToString(mainComponent, Constant.class, Object::toString));
sb.append("\nVariables: ");
sb.append(elementsToString(mainComponent, Variable.class, Variable::getName));
sb.append("\nOperations: ");
sb.append(elementsToString(mainComponent, BEvent.class, Object::toString));
sb.append('\n');
return new DisplayData(sb.toString());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment