The Monty Hall puzzle is paradox that describes the choice participants had to makein the TV games show hosted by Monty Hall.
% Based on Monty Hall problem on https://github.com/friguzzi/cplint
1/3::prize(1) ; 1/3::prize(2) ; 1/3::prize(3).
select_door(1).
member(X,[X|T]).
member(X,[H|T]) :- member(X,T).
0.5::open_door(A) ; 0.5::open_door(B) :-
member(A, [1,2,3]),
member(B, [1,2,3]),
A < B,
\+ prize(A), \+ prize(B),
\+ select_door(A), \+ select_door(B).
open_door(A) :-
member(A, [1,2,3]),
member(B, [1,2,3]),
\+ prize(A), prize(B),
\+ select_door(A), \+ select_door(B).
win_keep :-
select_door(A),
prize(A).
win_switch :-
member(A, [1,2,3]),
\+ select_door(A),
prize(A),
\+ open_door(A).
query(prize(_)).
query(select_door(_)).
query(win_keep).
query(win_switch).
/************************************
There is 1/3 chance that I picked a car.
I picked a goat, if I did not pick a car.
There is 1/2 chance that I picked goat1, if I picked a goat.
I picked goat2, if I picked a goat and did not pick goat1.
There is 1/2 chance that goat1 is revealed, if I picked a car.
Goat1 is revealed, if I picked goat2.
There is 1/2 chance that goat2 is revealed, if I picked a car.
Goat2 is revealed, if I picked goat1.
Switching gets me a car, if I picked a goat and a goat was revealed.
Switching gets me a goat, if switching did not get me a car.
*************************************/
1/3::picked_car.
picked_goat:- not(picked_car).
1/2::picked_goat1:- picked_goat.
picked_goat2:- picked_goat, not(picked_goat1).
1/2::revealed_goat1:- picked_car.
revealed_goat1:- picked_goat2.
1/2::revealed_goat2:- picked_car.
revealed_goat2:- picked_goat1.
revealed_goat:- revealed_goat1 ; revealed_goat2.
switched_gets_car:-picked_goat, revealed_goat.
switched_gets_goat:- not(switched_gets_car).
query(switched_gets_car).
query(switched_gets_goat).