/* Changes problem in Picat. http://stackoverflow.com/questions/29757699/how-does-this-prolog-program-resolve-to-h-2-i-dont-understand-the-line-of-exec """ It's a program to make change on a dollar. H is half dollars, Q is quarters, D for dimes, N for nickels, P for pennies. """ Yet another change problem: - using member/2 - using between/3 - using CP This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. % Logic programming, using member go ?=> change(H, Q, D, N, P), println([h=H, q=Q, d=D, n=N, p=P]), fail, nl. go => true. % LP, using between go2 ?=> change2(H, Q, D, N, P), println([h=H, q=Q, d=D, n=N, p=P]), fail, nl. go2 => true. % Using CP go3 ?=> change_cp(H, Q, D, N, P), println([h=H, q=Q, d=D, n=N, p=P]), fail, nl. go3 => true. % member/2 change(H, Q, D, N, P) => member(H, 0..2), member(Q, 0..4), member(D, 0..10), member(N, 0..20), S = 50*H + 25*Q + 10*D + 5*N, S =< 100, P = 100-S. % between/3 change2(H, Q, D, N, P) => between(0, 2, H), between(0, 4, Q), between(0, 10, D), between(0, 20, N), S = 50*H + 25*Q + 10*D + 5*N, S =< 100, P = 100-S. % CP change_cp(H, Q, D, N, P) => H :: 0..2, Q :: 0..4, D :: 0..10, N :: 0..20, S #= 50*H + 25*Q + 10*D + 5*N, S #=< 100, P #= 100-S, solve([H,Q,D,N,P]).