69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
%%% -*- Mode: Prolog; -*-
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% ProbLog program describing a probabilistic graph using tabling
 | 
						|
% (running example from ProbLog presentations)
 | 
						|
% $Id: graph_tabled.pl 4875 2010-10-05 15:28:35Z theo $
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
:- use_module(library(problog)).
 | 
						|
 | 
						|
% New trie method ensures Probibilistic Cycle Handling needed for tabling that handles loops
 | 
						|
:- set_problog_flag(use_db_trie, true).
 | 
						|
:- set_problog_flag(use_old_trie, false).
 | 
						|
 | 
						|
%%%%
 | 
						|
% background knowledge
 | 
						|
%%%%
 | 
						|
% definition of acyclic path using list of visited nodes
 | 
						|
 | 
						|
% to table a predicate you first need to define it as a dynamic one
 | 
						|
:- dynamic path/2.
 | 
						|
 | 
						|
path(X,X).
 | 
						|
path(X,Y) :-
 | 
						|
  X\==Y,
 | 
						|
  edge(X,Z),
 | 
						|
  path(Z,Y).
 | 
						|
 | 
						|
:- problog_table path/2.
 | 
						|
% after all predicate definitions have appeared you need to state that the predicate will be tabled
 | 
						|
 | 
						|
% using directed edges in both directions
 | 
						|
edge(X,Y) :- dir_edge(Y,X).
 | 
						|
edge(X,Y) :- dir_edge(X,Y).
 | 
						|
 | 
						|
 | 
						|
%%%%
 | 
						|
% probabilistic facts
 | 
						|
%%%%
 | 
						|
0.9::dir_edge(1,2).
 | 
						|
0.8::dir_edge(2,3).
 | 
						|
0.6::dir_edge(3,4).
 | 
						|
0.7::dir_edge(1,6).
 | 
						|
0.5::dir_edge(2,6).
 | 
						|
0.4::dir_edge(6,5).
 | 
						|
0.7::dir_edge(5,3).
 | 
						|
0.2::dir_edge(5,4).
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% example queries about tabled path(1,4) useable only with problog_exact, problog_montecarlo currently
 | 
						|
%
 | 
						|
%%% success probability
 | 
						|
%     ?- problog_exact(path(1,4),Prob,Status).
 | 
						|
%  Prob = 0.53864,
 | 
						|
%  Status = ok ?
 | 
						|
%  yes
 | 
						|
%%% approximation using monte carlo, to reach 95%-confidence interval width 0.01
 | 
						|
%     ?- problog_montecarlo(path(1,4),0.01,Prob).
 | 
						|
%  Prob = 0.537525 ?
 | 
						|
%  yes
 | 
						|
%%% success probability of negation
 | 
						|
%     ?- problog_exact(problog_neg(path(1,4)),Prob,Status).
 | 
						|
%  Prob = 0.46136,
 | 
						|
%  Status = ok ?
 | 
						|
%  yes
 | 
						|
%
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 |