/* Parking cars in Picat. From https://www.reddit.com/r/Probability/comments/1f4dd3j/parking_cars/ """ Parking Cars I've been thinking through this probability question that has left me a little confused and was wondering if there was anyone here who could help point me in the right direction. It goes like this: There are 10 spots in a parking lot arranged in a single row. Three cars are parked randomly. What is the probability that none of these cars are in adjacent spots? """ Note: num-adjacent here means number of adjacent pairs. This, for n parked cars, there are n-1 adjacent pairs. Cf my Gamble model gamble_parking_cars.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. /* num_to_park = 1 var : num adjacent Probabilities: 0: 1.0000000000000000 mean = 0.0 var : p Probabilities: true: 1.0000000000000000 mean = [true = 1.0] num_to_park = 2 var : num adjacent Probabilities: 0: 0.8010000000000000 1: 0.1990000000000000 mean = 0.199 var : p Probabilities: true: 0.8010000000000000 false: 0.1990000000000000 mean = [true = 0.801,false = 0.199] num_to_park = 3 var : num adjacent Probabilities: 0: 0.4667000000000000 1: 0.4656000000000000 2: 0.0677000000000000 mean = 0.601 var : p Probabilities: false: 0.5333000000000000 true: 0.4667000000000000 mean = [false = 0.5333,true = 0.4667] num_to_park = 4 var : num adjacent Probabilities: 1: 0.5029000000000000 2: 0.2953000000000000 0: 0.1695000000000000 3: 0.0323000000000000 mean = 1.1904 var : p Probabilities: false: 0.8305000000000000 true: 0.1695000000000000 mean = [false = 0.8305,true = 0.1695] num_to_park = 5 var : num adjacent Probabilities: 2: 0.4848000000000000 1: 0.2409000000000000 3: 0.2308000000000000 0: 0.0232000000000000 4: 0.0203000000000000 mean = 1.9841 var : p Probabilities: false: 0.9768000000000000 true: 0.0232000000000000 mean = [false = 0.9768,true = 0.0232] num_to_park = 6 var : num adjacent Probabilities: 3: 0.4707000000000000 4: 0.2429000000000000 2: 0.2370000000000000 5: 0.0267000000000000 1: 0.0227000000000000 mean = 3.0139 var : p Probabilities: false: 1.0000000000000000 mean = [false = 1.0] num_to_park = 7 var : num adjacent Probabilities: 4: 0.4977000000000000 5: 0.2970000000000000 3: 0.1743000000000000 6: 0.0310000000000000 mean = 4.1847 var : p Probabilities: false: 1.0000000000000000 mean = [false = 1.0] num_to_park = 8 var : num adjacent Probabilities: 5: 0.4664000000000000 6: 0.4637000000000000 7: 0.0699000000000000 mean = 5.6035 var : p Probabilities: false: 1.0000000000000000 mean = [false = 1.0] num_to_park = 9 var : num adjacent Probabilities: 7: 0.7986000000000000 8: 0.2014000000000000 mean = 7.2014 var : p Probabilities: false: 1.0000000000000000 mean = [false = 1.0] num_to_park = 10 var : num adjacent Probabilities: 9: 1.0000000000000000 mean = 9.0 var : p Probabilities: false: 1.0000000000000000 mean = [false = 1.0] */ go ?=> member(NumToPark,1..10), println(num_to_park=NumToPark), reset_store, run_model(10_000,$model(NumToPark),[show_probs_trunc,mean]), nl, % show_store_lengths, fail, nl. go => true. model(NumToPark) => NumCars = 10, Cars = draw_without_replacement(NumToPark,1..NumCars), CarsSorted = Cars.sort, NumAdjacent = [ cond(CarsSorted[I]-CarsSorted[I-1]==1,1,0) : I in 2..NumToPark].sum, P = check(NumAdjacent == 0), add("p",P), add("num adjacent",NumAdjacent).