@Override
  public List<Move> getLegalMoves(MachineState state, Role role) throws MoveDefinitionException {
    Set<GdlSentence> results =
        prover.askAll(ProverQueryBuilder.getLegalQuery(role), ProverQueryBuilder.getContext(state));

    if (results.size() == 0) {
      throw new MoveDefinitionException(state, role);
    }

    return new ProverResultParser().toMoves(results);
  }
  @Override
  public MachineState getNextState(MachineState state, List<Move> moves)
      throws TransitionDefinitionException {
    Set<GdlSentence> results =
        prover.askAll(
            ProverQueryBuilder.getNextQuery(),
            ProverQueryBuilder.getContext(state, getRoles(), moves));

    for (GdlSentence sentence : results) {
      if (!sentence.isGround()) {
        throw new TransitionDefinitionException(state, moves);
      }
    }

    return new ProverResultParser().toState(results);
  }
  @Override
  public int getGoal(MachineState state, Role role) throws GoalDefinitionException {
    Set<GdlSentence> results =
        prover.askAll(ProverQueryBuilder.getGoalQuery(role), ProverQueryBuilder.getContext(state));

    if (results.size() != 1) {
      GamerLogger.logError(
          "StateMachine",
          "Got goal results of size: " + results.size() + " when expecting size one.");
      throw new GoalDefinitionException(state, role);
    }

    try {
      GdlRelation relation = (GdlRelation) results.iterator().next();
      GdlConstant constant = (GdlConstant) relation.get(1);

      return Integer.parseInt(constant.toString());
    } catch (Exception e) {
      throw new GoalDefinitionException(state, role);
    }
  }
 private MachineState computeInitialState() {
   Set<GdlSentence> results =
       prover.askAll(ProverQueryBuilder.getInitQuery(), new HashSet<GdlSentence>());
   return new ProverResultParser().toState(results);
 }
 @Override
 public boolean isTerminal(MachineState state) {
   return prover.prove(
       ProverQueryBuilder.getTerminalQuery(), ProverQueryBuilder.getContext(state));
 }