/* Probabilistic graphs in Picat. https://dtai.cs.kuleuven.be/problog/tutorial/basic/04_pgraph.html ProbLog model: """ 0.6::edge(1,2). 0.1::edge(1,3). 0.4::edge(2,5). 0.3::edge(2,6). 0.3::edge(3,4). 0.8::edge(4,5). 0.2::edge(5,6). path(X,Y) :- edge(X,Y). path(X,Y) :- edge(X,Z), Y \== Z, path(Z,Y). query(path(1,5)). query(path(1,6)). query(path(5,2)). """ Results from the ProbLog model """ path(1,5): 0.25824 (i.e. 0->4) path(1,6): 0.2167296 (i.e. 0->5) """ Cf my Gamble model gamble_probabilistic_graphs.rkt This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import ppl_distributions, ppl_utils. import util. main => go. /* Paths: 1->6 and 1->6 var : path 1-> 5 Probabilities: false: 0.7421000000000000 true: 0.2579000000000000 mean = [false = 0.7421,true = 0.2579] var : path 1-> 6 Probabilities: false: 0.7841000000000000 true: 0.2159000000000000 mean = [false = 0.7841,true = 0.2159] All paths: path 1 -> 1 var : p Probabilities: false: 1.0000000000000000 path 1 -> 2 var : p Probabilities: true: 0.5998000000000000 false: 0.4002000000000000 path 1 -> 3 var : p Probabilities: false: 0.8961000000000000 true: 0.1039000000000000 path 1 -> 4 var : p Probabilities: false: 0.9706000000000000 true: 0.0294000000000000 path 1 -> 5 var : p Probabilities: false: 0.7441000000000000 true: 0.2559000000000000 path 1 -> 6 var : p Probabilities: false: 0.7853000000000000 true: 0.2147000000000000 path 2 -> 1 var : p Probabilities: false: 1.0000000000000000 path 2 -> 2 var : p Probabilities: false: 1.0000000000000000 path 2 -> 3 var : p Probabilities: false: 1.0000000000000000 path 2 -> 4 var : p Probabilities: false: 1.0000000000000000 path 2 -> 5 var : p Probabilities: false: 0.5936000000000000 true: 0.4064000000000000 path 2 -> 6 var : p Probabilities: false: 0.6460000000000000 true: 0.3540000000000000 path 3 -> 1 var : p Probabilities: false: 1.0000000000000000 path 3 -> 2 var : p Probabilities: false: 1.0000000000000000 path 3 -> 3 var : p Probabilities: false: 1.0000000000000000 path 3 -> 4 var : p Probabilities: false: 0.7027000000000000 true: 0.2973000000000000 path 3 -> 5 var : p Probabilities: false: 0.7625000000000000 true: 0.2375000000000000 path 3 -> 6 var : p Probabilities: false: 0.9558000000000000 true: 0.0442000000000000 path 4 -> 1 var : p Probabilities: false: 1.0000000000000000 path 4 -> 2 var : p Probabilities: false: 1.0000000000000000 path 4 -> 3 var : p Probabilities: false: 1.0000000000000000 path 4 -> 4 var : p Probabilities: false: 1.0000000000000000 path 4 -> 5 var : p Probabilities: true: 0.8014000000000000 false: 0.1986000000000000 path 4 -> 6 var : p Probabilities: false: 0.8398000000000000 true: 0.1602000000000000 path 5 -> 1 var : p Probabilities: false: 1.0000000000000000 path 5 -> 2 var : p Probabilities: false: 1.0000000000000000 path 5 -> 3 var : p Probabilities: false: 1.0000000000000000 path 5 -> 4 var : p Probabilities: false: 1.0000000000000000 path 5 -> 5 var : p Probabilities: false: 1.0000000000000000 path 5 -> 6 var : p Probabilities: false: 0.7960000000000000 true: 0.2040000000000000 path 6 -> 1 var : p Probabilities: false: 1.0000000000000000 path 6 -> 2 var : p Probabilities: false: 1.0000000000000000 path 6 -> 3 var : p Probabilities: false: 1.0000000000000000 path 6 -> 4 var : p Probabilities: false: 1.0000000000000000 path 6 -> 5 var : p Probabilities: false: 1.0000000000000000 path 6 -> 6 var : p Probabilities: false: 1.0000000000000000 */ go ?=> N = 6, member(I,1..N), member(J,1..N), printf("path %d -> %d\n",I,J), reset_store, run_model(10_000,$model(I,J),[show_probs_trunc]), nl, % show_store_lengths, fail, nl. go => true. edge(T1,T2,M) = flip(M[T1,T2]). path(T1,T2,M,Edges) = Ret => if edge(T1,T2,M) == true then Ret = true else if member(T3,Edges), T2 != T3, T1 != T3, edge(T1,T3,M) == true,path(T3,T2,M,Edges) == true then Ret = true else Ret = false end end. model(I,J) => % Graph % 1 -> 2,3 % 2 -> 5,6 % 3 -> 4 % 4 -> 5 % 5 -> 6 % 6 -> () M = [ %% 1 2 3 4 5 6 [0.0, 0.6, 0.1, 0.0, 0.0, 0.0], % 1 [0.0, 0.0, 0.0, 0.0, 0.4, 0.3], % 2 [0.0, 0.0, 0.0, 0.3, 0.0, 0.0], % 3 [0.0, 0.0, 0.0, 0.0, 0.8, 0.0], % 4 [0.0, 0.0, 0.0, 0.0, 0.0, 0.2], % 5 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] % 6 ], N = M.len, Edges = 1..N, % P1_5 = path(1,5,M,Edges), % P1_6 = path(1,6,M,Edges), % add("path 1-> 5",P1_5), % add("path 1-> 6",P1_6). add("p",path(I,J,M,Edges)). % foreach(I in 1..N, J in 1..N) % add("path "++ I.to_string ++ "-> " ++ J.to_string,path(I,J,M,Edges)), % end.