98 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| 
 | |
| :- style_check(all).
 | |
| 
 | |
| :- use_module(library(bdd)).
 | |
| :- use_module(library(lists)).
 | |
| :- use_module(library(maplist)).
 | |
| 
 | |
| t1 :-
 | |
| 	t1(X),
 | |
| 	writeln(X),
 | |
| 	fail.
 | |
| t1.
 | |
| 
 | |
| t1(BDD:T) :-
 | |
| 	bdd_new(X+(_Y+X)*(-_Z), BDD),
 | |
| 	bdd_tree(BDD,T).
 | |
| 
 | |
| 
 | |
| t2 :-
 | |
| 	t2(X),
 | |
| 	writeln(X),
 | |
| 	fail.
 | |
| t2.
 | |
| 
 | |
| t2(V) :-
 | |
| 	bdd_new(X+(Y+X)*(-Z), BDD),
 | |
| 	member(X, [0,1]),
 | |
| 	member(Y, [0,1]),
 | |
| 	member(Z, [0,1]),
 | |
| 	bdd_eval(BDD, V).
 | |
| 
 | |
| t3 :-
 | |
| 	t3(X),
 | |
| 	writeln(X),
 | |
| 	fail.
 | |
| t3.
 | |
| 
 | |
| t3(V) :-
 | |
| 	bdd_new(X+(Y+X)*(-Z), BDD),
 | |
| 	bdd_tree(BDD, bdd(_, T, _Vs) ),
 | |
| 	reverse(T, RT),
 | |
| 	member(X, [0,1]),
 | |
| 	member(Y, [0,1]),
 | |
| 	member(Z, [0,1]),
 | |
| 	foldl(eval_bdd, RT, _, V).
 | |
| 
 | |
| eval_bdd(pp(P,X,L,R), _, P) :-
 | |
| 	P is ( X/\L ) \/ ( (1-X) /\ R ).
 | |
| eval_bdd(pn(P,X,L,R), _, P) :-
 | |
| 	P is ( X/\L ) \/ ( (1-X) /\ (1-R) ).
 | |
| 
 | |
| 
 | |
| 
 | |
| t4 :-
 | |
| 	t4(_),
 | |
| 	fail.
 | |
| t4.
 | |
| 
 | |
| t4([X,Y,Z]) :-
 | |
| 	bdd_new(X+(Y+X)*(-Z), BDD),
 | |
| 	bdd_print(BDD, user_output).
 | |
| 
 | |
| 
 | |
| 
 | |
| t5 :-
 | |
| 	t5(X),
 | |
| 	writeln(X),
 | |
| 	fail.
 | |
| t5.
 | |
| 
 | |
| t5(V) :-
 | |
| 	bdd_new(X+(Y+X)*(-Z), BDD),
 | |
| 	member(X, [0.3,0.7]),
 | |
| 	member(Y, [0.4,0.6]),
 | |
| 	member(Z, [0.9,0.1]),
 | |
| 	bdd_to_probability_sum_product(BDD, V).
 | |
| 
 | |
| 
 | |
| t6 :-
 | |
| 	t6(X),
 | |
| 	writeln(X),
 | |
| 	fail.
 | |
| t6.
 | |
| 
 | |
| t6(V) :-
 | |
| 	bdd_new(X+(Y+X)*(-Z), BDD),
 | |
| 	bdd_tree(BDD, bdd(_, T, _Vs) ),
 | |
| 	reverse(T, RT),
 | |
| 	member(X, [0.3,0.7]),
 | |
| 	member(Y, [0.4,0.6]),
 | |
| 	member(Z, [0.9,0.1]),
 | |
| 	foldl(eval_prob, RT, _, V).
 | |
| 
 | |
| eval_prob(pp(P,X,L,R), _, P) :-
 | |
| 	P is  X*L +  (1-X) * R.
 | |
| eval_prob(pn(P,X,L,R), _, P) :-
 | |
| 	P is  X * L + (1-X) * (1-R).
 |