OSDN Git Service

Messing with TLA+ in Prolog.
authorSimon Forman <sforman@hushmail.com>
Sun, 21 Jul 2019 18:50:27 +0000 (11:50 -0700)
committerSimon Forman <sforman@hushmail.com>
Sun, 21 Jul 2019 18:50:27 +0000 (11:50 -0700)
thun/TLA.pl [new file with mode: 0644]

diff --git a/thun/TLA.pl b/thun/TLA.pl
new file mode 100644 (file)
index 0000000..7402259
--- /dev/null
@@ -0,0 +1,102 @@
+\r
+:- use_module(library(clpfd)).\r
+\r
+\r
+% relly(PC, I, PCnext, Inext).\r
+\r
+initial_state :- relly(start, 0, _, _).\r
+\r
+relly(start, _I, middle, Inext) :- Inext in 0..1000.\r
+relly(middle, I,   done, Inext) :- Inext #= I + 1.\r
+\r
+\r
+% next(PC, I) :- \r
+next(done, _).\r
+next(PC, I) :- PC \= done, relly(PC, I, PCnext, Inext), next(PCnext, Inext).\r
+\r
+\r
+% ?- relly(start, 17, middle, 534).\r
+% true.\r
+\r
+% ?- relly(middle, 534, 77, done).\r
+% false.\r
+\r
+% ?- initial_state.\r
+% true.\r
+\r
+% ?- relly(start, 0, PC, I).\r
+% PC = middle,\r
+% I in 0..1000.\r
+\r
+% ?- relly(start, 0, PC, I), relly(PC, I, PCnext, Inext).\r
+% PC = middle,\r
+% PCnext = done,\r
+% I in 0..1000,\r
+% I+1#=Inext,\r
+% Inext in 1..1001.\r
+\r
+\r
+\r
+type_ok(Small, Big) :- Small in 0..3, Big in 0..5.\r
+\r
+initi :- die_hard(0, 0, _, _).\r
+\r
+next_dh(Small, Big, S, B) :-\r
+    B #\= 4,\r
+    type_ok(Small, Big),\r
+    die_hard(Small, Big, Si, Bi),\r
+    write(Small), write(" "), write(Big), write(" -> "), write(Si), write(" "), writeln(Bi),\r
+    (Bi = 4 -> true ; next_dh(Si, Bi, S, B)).\r
+next_dh(_, _, _, 4).\r
+\r
+\r
+\r
+% die_hard(Small, Big, S, B).\r
+die_hard(Small, Big, 3, Big) :- Small #\= 3, writeln("fill small").  % Fill small.\r
+die_hard(Small, Big, Small, 5) :- Big #\= 5, writeln("fill big").  % Fill big.\r
+\r
+die_hard(Small, Big, 0, Big) :- Small #> 0, writeln("empty small").  % empty small.\r
+die_hard(Small, Big, Small, 0) :- Big #> 0, writeln("empty big").  % empty big.\r
+\r
+die_hard(Small, Big, 0, B) :-  % small to big.\r
+    Big #< 5, Small #> 0,\r
+    Small + Big #=< 5,\r
+    B is Small + Big, writeln("small to big").    \r
+die_hard(Small, Big, S, 5) :-  % small to big.\r
+    Big #< 5, Small #> 0,\r
+    Small + Big #> 5,\r
+    N is 5 - Big,\r
+    (N #< Small -> S is Small - N ; S=0), writeln("small to big").    \r
+\r
+die_hard(Small, Big, S, 0) :-  % big to small.\r
+    Small #< 3, Big #> 0,\r
+    Small + Big #=< 3,\r
+    S is Small + Big, writeln("big to small").    \r
+\r
+die_hard(Small, Big, 3, B) :-  % big to small.\r
+    Small #< 3, Big #> 0,\r
+    Small + Big #> 3,\r
+    N is 3 - Small,\r
+    (N #< Big -> B is Big - N ; B=0), writeln("big to small").    \r
+\r
+/*\r
+\r
+call_with_depth_limit(next_dh(0, 0, S, B), 12, REsult).\r
+\r
+find...\r
+\r
+fill big\r
+0 0 -> 0 5\r
+big to small\r
+0 5 -> 3 2\r
+empty small\r
+3 2 -> 0 2\r
+big to small\r
+0 2 -> 2 0\r
+fill big\r
+2 0 -> 2 5\r
+big to small\r
+2 5 -> 3 4\r
+\r
+\r
+*/
\ No newline at end of file