/* Person login in Picat. From Yi Wu, Lei Li, Stuart Russell "BFiT: From Possible-World Semantics to Random-Evaluation Semantics in Open Universe" Page 3 Cf my Gamble model gamble_person_login.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. /* var : num_people Probabilities (truncated): 5: 0.1803000000000000 6: 0.1774000000000000 7: 0.1442000000000000 4: 0.1436000000000000 ......... 13: 0.0033000000000000 14: 0.0020000000000000 15: 0.0004000000000000 17: 0.0001000000000000 mean = 5.9559 Histogram: 1: 72 ## (0.007 / 0.007) 2: 353 ############ (0.035 / 0.042) 3: 828 ############################ (0.083 / 0.125) 4: 1436 ################################################ (0.144 / 0.269) 5: 1803 ############################################################ (0.180 / 0.449) 6: 1774 ########################################################### (0.177 / 0.627) 7: 1442 ################################################ (0.144 / 0.771) 8: 1002 ################################# (0.100 / 0.871) 9: 638 ##################### (0.064 / 0.935) 10: 350 ############ (0.035 / 0.970) 11: 172 ###### (0.017 / 0.987) 12: 72 ## (0.007 / 0.994) 13: 33 # (0.003 / 0.997) 14: 20 # (0.002 / 0.999) 15: 4 (0.000 / 1.000) 17: 1 (0.000 / 1.000) var : sample_login Probabilities: 1: 0.9179000000000000 0: 0.0784000000000000 2: 0.0030000000000000 4: 0.0004000000000000 3: 0.0003000000000000 mean = 0.9264 Histogram: 0: 784 ##### (0.078 / 0.078) 1: 9179 ############################################################ (0.918 / 0.996) 2: 30 (0.003 / 0.999) 3: 3 (0.000 / 1.000) 4: 4 (0.000 / 1.000) var : num_honest Probabilities (truncated): 5: 0.1868000000000000 4: 0.1759000000000000 6: 0.1638000000000000 7: 0.1262000000000000 ......... 13: 0.0022000000000000 0: 0.0011000000000000 14: 0.0007000000000000 15: 0.0002000000000000 mean = 5.3631 Histogram: 0: 11 (0.001 / 0.001) 1: 160 ##### (0.016 / 0.017) 2: 594 ################### (0.059 / 0.076) 3: 1160 ##################################### (0.116 / 0.193) 4: 1759 ######################################################## (0.176 / 0.368) 5: 1868 ############################################################ (0.187 / 0.555) 6: 1638 ##################################################### (0.164 / 0.719) 7: 1262 ######################################### (0.126 / 0.845) 8: 765 ######################### (0.076 / 0.922) 9: 440 ############## (0.044 / 0.966) 10: 194 ###### (0.019 / 0.985) 11: 85 ### (0.009 / 0.994) 12: 33 # (0.003 / 0.997) 13: 22 # (0.002 / 0.999) 14: 7 (0.001 / 1.000) 15: 2 (0.000 / 1.000) var : honest_sample_login Probabilities: true: 0.9179000000000000 false: 0.0821000000000000 mean = [true = 0.9179,false = 0.0821] Histogram: false : 821 ##### (0.082 / 0.082) true : 9179 ############################################################ (0.918 / 1.000) */ go ?=> reset_store, run_model(10_000,$model,[show_probs_trunc,mean,show_histogram]), nl, % fail, nl. go => true. model() => % Number of people NumPeople = poisson_dist(5)+1, % Is this person honest? Honest = [ flip(0.9) : _ in 1..NumPeople], % How many are honest? NumHonest = [condt(Honest[P],1,0) : P in 1..NumPeople].sum, % An honest person have just one login Login = [ condt(Honest[P],1, geometric_dist(0.8)) : P in 1..NumPeople], % Pick one person SampleLogin = uniform_draw(Login), HonestSampleLogin = check(SampleLogin==1), add("num_people",NumPeople), add("sample_login",SampleLogin), add("num_honest",NumHonest), add("honest_sample_login",HonestSampleLogin).