src/HOL/Tools/Nitpick/kodkod.scala
author wenzelm
Fri, 01 Apr 2022 17:06:10 +0200
changeset 75393 87ebf5a50283
parent 74486 74a36aae067a
child 78243 0e221a8128e4
permissions -rw-r--r--
clarified formatting, for the sake of scala3;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     1
/*  Title:      HOL/Tools/Nitpick/kodkod.scala
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     3
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     4
Scala interface for Kodkod.
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     5
*/
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     6
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     7
package isabelle.nitpick
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     8
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
     9
import isabelle._
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    10
72336
41a4352c5240 more robust executor policy after shutdown;
wenzelm
parents: 72218
diff changeset
    11
import java.util.concurrent.{TimeUnit, LinkedBlockingQueue, ThreadPoolExecutor}
72177
fbaa6b40b439 update to kodkodi-1.5.4;
wenzelm
parents: 72176
diff changeset
    12
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    13
import org.antlr.runtime.{ANTLRInputStream, RecognitionException}
74486
74a36aae067a updated to kodkodi-1.5.7. with more robust/portable management of files and processes;
wenzelm
parents: 74306
diff changeset
    14
import isabelle.kodkodi.{Context, KodkodiLexer, KodkodiParser}
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    15
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    16
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    17
object Kodkod {
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    18
  /** result **/
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    19
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    20
  sealed case class Result(rc: Int, out: String, err: String) {
74306
a117c076aa22 clarified signature;
wenzelm
parents: 73565
diff changeset
    21
    def ok: Boolean = rc == Process_Result.RC.ok
72179
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
    22
    def check: String =
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
    23
      if (ok) out else error(if (err.isEmpty) "Error" else err)
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
    24
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    25
    def encode: XML.Body = {
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
    26
      import XML.Encode._
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
    27
      triple(int, string, string)((rc, out, err))
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
    28
    }
72179
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
    29
  }
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    30
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    31
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    32
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    33
  /** execute **/
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    34
72179
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
    35
  def execute(source: String,
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    36
    solve_all: Boolean = false,
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    37
    prove: Boolean = false,
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    38
    max_solutions: Int = Integer.MAX_VALUE,
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    39
    cleanup_inst: Boolean = false,
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    40
    timeout: Time = Time.zero,
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    41
    max_threads: Int = 0
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    42
  ): Result = {
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    43
    /* executor */
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    44
72201
wenzelm
parents: 72199
diff changeset
    45
    val pool_size = if (max_threads == 0) Isabelle_Thread.max_threads() else max_threads
72336
41a4352c5240 more robust executor policy after shutdown;
wenzelm
parents: 72218
diff changeset
    46
    val executor: ThreadPoolExecutor =
41a4352c5240 more robust executor policy after shutdown;
wenzelm
parents: 72218
diff changeset
    47
      new ThreadPoolExecutor(pool_size, pool_size, 0L, TimeUnit.MILLISECONDS,
41a4352c5240 more robust executor policy after shutdown;
wenzelm
parents: 72218
diff changeset
    48
        new LinkedBlockingQueue[Runnable], new ThreadPoolExecutor.CallerRunsPolicy)
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    49
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    50
    val executor_killed = Synchronized(false)
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    51
    def executor_kill(): Unit =
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    52
      executor_killed.change(b =>
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    53
        if (b) b else { Isabelle_Thread.fork() { executor.shutdownNow() }; true })
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    54
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    55
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    56
    /* system context */
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    57
72203
733bab4c1be0 suppress odd warning for context.exit();
wenzelm
parents: 72201
diff changeset
    58
    class Exit extends Exception("EXIT")
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    59
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
    60
    class Exec_Context extends Context {
74306
a117c076aa22 clarified signature;
wenzelm
parents: 73565
diff changeset
    61
      private var rc = Process_Result.RC.ok
73338
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    62
      private val out = new StringBuilder
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    63
      private val err = new StringBuilder
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    64
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    65
      def return_code(i: Int): Unit = synchronized { rc = rc max i}
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    66
73338
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    67
      override def output(s: String): Unit = synchronized {
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    68
        Exn.Interrupt.expose()
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    69
        out ++= s
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    70
        out += '\n'
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    71
      }
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    72
73338
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    73
      override def error(s: String): Unit = synchronized {
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    74
        Exn.Interrupt.expose()
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    75
        err ++= s
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    76
        err += '\n'
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    77
      }
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    78
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    79
      override def exit(i: Int): Unit =
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    80
        synchronized {
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    81
          return_code(i)
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    82
          executor_kill()
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    83
          throw new Exit
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    84
        }
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    85
73338
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    86
      def result(): Result = synchronized { Result(rc, out.toString, err.toString) }
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    87
    }
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    88
73338
5c0e23d73cea tuned --- fewer warnings;
wenzelm
parents: 72756
diff changeset
    89
    val context = new Exec_Context
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    90
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    91
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    92
    /* main */
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
    93
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    94
    try {
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73338
diff changeset
    95
      val lexer = new KodkodiLexer(new ANTLRInputStream(Bytes(source).stream()))
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    96
      val parser =
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    97
        KodkodiParser.create(context, executor,
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
    98
          false, solve_all, prove, max_solutions, cleanup_inst, lexer)
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
    99
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   100
      val timeout_request =
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   101
        if (timeout.is_zero) None
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   102
        else {
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   103
          Some(Event_Timer.request(Time.now() + timeout) {
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   104
            context.error("Ran out of time")
74306
a117c076aa22 clarified signature;
wenzelm
parents: 73565
diff changeset
   105
            context.return_code(Process_Result.RC.failure)
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   106
            executor_kill()
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   107
          })
72177
fbaa6b40b439 update to kodkodi-1.5.4;
wenzelm
parents: 72176
diff changeset
   108
        }
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   109
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   110
      try { parser.problems() }
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   111
      catch { case exn: RecognitionException => parser.reportError(exn) }
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   112
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73338
diff changeset
   113
      timeout_request.foreach(_.cancel())
72177
fbaa6b40b439 update to kodkodi-1.5.4;
wenzelm
parents: 72176
diff changeset
   114
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   115
      if (parser.getTokenStream.LA(1) != KodkodiParser.EOF) {
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   116
        context.error("Error: trailing tokens")
74306
a117c076aa22 clarified signature;
wenzelm
parents: 73565
diff changeset
   117
        context.exit(Process_Result.RC.error)
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   118
      }
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   119
      if (lexer.getNumberOfSyntaxErrors + parser.getNumberOfSyntaxErrors > 0) {
74306
a117c076aa22 clarified signature;
wenzelm
parents: 73565
diff changeset
   120
        context.exit(Process_Result.RC.error)
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   121
      }
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   122
    }
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   123
    catch {
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   124
      case _: Exit =>
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   125
      case exn: Throwable =>
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   126
        val message = exn.getMessage
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   127
        context.error(if (message.isEmpty) exn.toString else "Error: " + message)
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   128
        context.return_code(1)
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   129
    }
72177
fbaa6b40b439 update to kodkodi-1.5.4;
wenzelm
parents: 72176
diff changeset
   130
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
   131
    executor.shutdownNow()
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
   132
72178
2481cdb84832 more realistic kodkod invocation, imitating command-line tool;
wenzelm
parents: 72177
diff changeset
   133
    context.result()
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
   134
  }
72179
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
   135
72218
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   136
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   137
  /** protocol handler **/
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   138
72179
0841895ca438 clarified signature;
wenzelm
parents: 72178
diff changeset
   139
  def warmup(): String =
72181
6241cbbf5a58 preload library;
wenzelm
parents: 72179
diff changeset
   140
    execute(
72199
8dc2e4d9deaa proper default for max_threads;
wenzelm
parents: 72196
diff changeset
   141
      "solver: \"MiniSat\"\n" +
72181
6241cbbf5a58 preload library;
wenzelm
parents: 72179
diff changeset
   142
      File.read(Path.explode("$KODKODI/examples/weber3.kki"))).check
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   143
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
   144
  class Handler extends Session.Protocol_Handler {
72218
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   145
    override def init(session: Session): Unit = warmup()
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   146
  }
a51736641843 initial Kodkod.warmup: preloading and basic integrity test;
wenzelm
parents: 72204
diff changeset
   147
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   148
72204
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
   149
cb746b19e1d7 more robust treatment of execution with interrupts;
wenzelm
parents: 72203
diff changeset
   150
  /** scala function **/
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   151
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
   152
  object Fun extends Scala.Fun_String("kodkod", thread = true) {
72756
72ac27ea12b2 more positions;
wenzelm
parents: 72336
diff changeset
   153
    val here = Scala_Project.here
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
   154
    def apply(args: String): String = {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74486
diff changeset
   155
      val (timeout, (solve_all, (max_solutions, (max_threads, kki)))) = {
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   156
        import XML.Decode._
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   157
        pair(int, pair(bool, pair(int, pair(int, string))))(YXML.parse_body(args))
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   158
      }
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   159
      val result =
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   160
        execute(kki,
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   161
          solve_all = solve_all,
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   162
          max_solutions = max_solutions,
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   163
          timeout = Time.ms(timeout),
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   164
          max_threads = max_threads)
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   165
      YXML.string_of_body(result.encode)
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   166
    }
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   167
  }
72176
22c11f65ddf9 rudiments of Scala interface for Kodkod;
wenzelm
parents:
diff changeset
   168
}
72196
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   169
6dba090358d2 invoke Nitpick/Kodkod via Isabelle/Scala (instead of external process);
wenzelm
parents: 72181
diff changeset
   170
class Scala_Functions extends Scala.Functions(Kodkod.Fun)