/* Battalion in Picat. "First-Order Probabilistic Inference" https://www.youtube.com/watch?v=leIqVD4-Fks Time 45:06 (The shown model in the talks is a BLOG model). This is a port of my Racket/Gamble model gamble_battalion.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. main => go. /* var : large(1) Probabilities: true: 0.5965000000000000 false: 0.4035000000000000 mean = [true = 0.5965,false = 0.4035] var : num-battalion Probabilities: 1: 0.1120000000000000 5: 0.1085000000000000 10: 0.1040000000000000 6: 0.1020000000000000 2: 0.1010000000000000 3: 0.0995000000000000 9: 0.0970000000000000 8: 0.0930000000000000 7: 0.0930000000000000 4: 0.0900000000000000 mean = 5.435 var : num_soldier(1) Probabilities (truncated): 300: 0.0330000000000000 737: 0.0140000000000000 748: 0.0135000000000000 740: 0.0130000000000000 733: 0.0125000000000000 745: 0.0105000000000000 727: 0.0105000000000000 749: 0.0100000000000000 742: 0.0100000000000000 734: 0.0100000000000000 763: 0.0095000000000000 738: 0.0095000000000000 730: 0.0090000000000000 759: 0.0085000000000000 753: 0.0085000000000000 752: 0.0085000000000000 741: 0.0085000000000000 739: 0.0085000000000000 736: 0.0085000000000000 717: 0.0085000000000000 ......... 673: 0.0005000000000000 669: 0.0005000000000000 596: 0.0005000000000000 579: 0.0005000000000000 566: 0.0005000000000000 558: 0.0005000000000000 557: 0.0005000000000000 550: 0.0005000000000000 549: 0.0005000000000000 545: 0.0005000000000000 544: 0.0005000000000000 538: 0.0005000000000000 478: 0.0005000000000000 459: 0.0005000000000000 457: 0.0005000000000000 453: 0.0005000000000000 452: 0.0005000000000000 450: 0.0005000000000000 443: 0.0005000000000000 431: 0.0005000000000000 mean = 644.24 var : num_soldiers_per-battalion Probabilities (truncated): [300]: 0.0145000000000000 [766]: 0.0025000000000000 [511]: 0.0025000000000000 [759]: 0.0020000000000000 [744]: 0.0020000000000000 [729]: 0.0020000000000000 [765]: 0.0015000000000000 [758]: 0.0015000000000000 [751]: 0.0015000000000000 [740]: 0.0015000000000000 [736]: 0.0015000000000000 [730]: 0.0015000000000000 [708]: 0.0015000000000000 [700]: 0.0015000000000000 [515]: 0.0015000000000000 [512]: 0.0015000000000000 [300,300]: 0.0015000000000000 [792]: 0.0010000000000000 [789]: 0.0010000000000000 [782]: 0.0010000000000000 ......... [300,726,683]: 0.0005000000000000 [300,725,496,759,699,737,775]: 0.0005000000000000 [300,720]: 0.0005000000000000 [300,717]: 0.0005000000000000 [300,530]: 0.0005000000000000 [300,529]: 0.0005000000000000 [300,528]: 0.0005000000000000 [300,527,735]: 0.0005000000000000 [300,526,511,488]: 0.0005000000000000 [300,524,491,508]: 0.0005000000000000 [300,523,715,751,747,726,739]: 0.0005000000000000 [300,506]: 0.0005000000000000 [300,503]: 0.0005000000000000 [300,501,761]: 0.0005000000000000 [300,501,559]: 0.0005000000000000 [300,480]: 0.0005000000000000 [300,473]: 0.0005000000000000 [300,471,464,513]: 0.0005000000000000 [300,470,828,777]: 0.0005000000000000 [300,461,746,488]: 0.0005000000000000 Mean (truncated) mean = [[300] = 0.0145,[766] = 0.0025,[511] = 0.0025,[759] = 0.002,[744] = 0.002,[729] = 0.002,[765] = 0.0015,[758] = 0.0015,[751] = 0.0015,[740] = 0.0015,[736] = 0.0015,[730] = 0.0015,[708] = 0.0015,[700] = 0.0015,[515] = 0.0015,[512] = 0.0015,[300,300] = 0.0015,[792] = 0.001,[789] = 0.001,[782] = 0.001] var : region(1) Probabilities: 2: 0.1150000000000000 6: 0.0995000000000000 3: 0.0960000000000000 5: 0.0950000000000000 7: 0.0885000000000000 4: 0.0880000000000000 8: 0.0775000000000000 9: 0.0685000000000000 10: 0.0575000000000000 1: 0.0565000000000000 11: 0.0465000000000000 12: 0.0365000000000000 13: 0.0305000000000000 14: 0.0180000000000000 15: 0.0125000000000000 16: 0.0070000000000000 17: 0.0045000000000000 19: 0.0010000000000000 18: 0.0010000000000000 21: 0.0005000000000000 mean = 6.451 */ go ?=> reset_store(), run_model(2000,$model,[show_probs_trunc,mean,truncate_size=20]), fail, nl. go => true. large(Bat) = flip(0.6). region(Bat,NumBattalion) = 1 + poisson_dist(NumBattalion). num_soldier(Bat,LargeBat,NumBattalion) = cond( LargeBat == true, poisson_dist(1500), cond( region(Bat,NumBattalion) == 2, 300, poisson_dist(500))). model() => NumBattalion = random_integer1(10), NumSoldiersPerBattalion = [num_soldier(Bat,large(Bat),NumBattalion) : Bat in 1..NumBattalion], add("num-battalion", NumBattalion), add("large(1)", large(1)), add("region(1)",region(1,NumBattalion)), add("num_soldier(1)",num_soldier(1,large(1),NumBattalion)), add("num_soldiers_per-battalion",NumSoldiersPerBattalion).