From 729f98e140616b3ad50d65fa0f07bb031725190d Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Wed, 5 Nov 2025 08:58:15 +0100 Subject: [PATCH] ex5: task 2.1 --- assignment5/main.pl | 43 ++++++++++++++++++++++++++++++------------- assignment5/task1.pl | 23 +++++++++++++++++++++++ 2 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 assignment5/task1.pl diff --git a/assignment5/main.pl b/assignment5/main.pl index e8e2ef4..5ee2ecc 100644 --- a/assignment5/main.pl +++ b/assignment5/main.pl @@ -2,22 +2,39 @@ :- initialization(main). main :- - findall([Ones,Fives,Tens,Twenties], - (payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]), label([Ones,Fives,Tens,Twenties])), + findall([Path, TotalDistance], + (plan(c1, c2, Path, TotalDistance)), Solutions), - forall(member(Sol, Solutions), (write('Solution: '), writeln(Sol))). + forall(member([Path, Distance], Solutions), ( + atomic_list_concat(Path, ' -> ', PathStr), + format('Solution: ~w (distance: ~w)~n', [PathStr, Distance]) + )). -payment(Sum, Coins) :- - payment_acc(0, Sum, Coins). -payment_acc(Acc, Sum, []) :- - Acc #= Sum. +distance(c1, c2, 10, 1). distance(c1, c3, 0, 0). distance(c1, c4, 7, 1). +distance(c1, c5, 5, 1). distance(c2, c3, 4, 1). distance(c2, c4, 12, 1). +distance(c2, c5, 20, 1). distance(c3, c4, 0, 0). distance(c3, c5, 0, 0). +distance(c4, c5, 0, 0). distance(c2, c1, 10, 1). distance(c3, c1, 0, 0). +distance(c4, c1, 7, 1). distance(c5, c1, 5, 1). distance(c3, c2, 4, 1). +distance(c4, c2, 12, 1). distance(c5, c2, 20, 1). distance(c4, c3, 0, 0). +distance(c5, c3, 0, 0). distance(c5, c4, 0, 0). -payment_acc(Acc, Sum, [coin(Count, Value, Available)|Tail]) :- - Count in 0..Available, - NewAcc #= Acc + Count * Value, - payment_acc(NewAcc, Sum, Tail). +% requested arity 4 predicate +plan(Cabin1, Cabin2, Path, TotalDistance) :- + plan(Cabin1, Cabin2, [Cabin1], Path, TotalDistance). -?- payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]). -?- payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]), label([Ones, Fives, Tens, Twenties]). +% base case +plan(Cabin1, Cabin2, Visited, Path, Distance) :- + not(Cabin1 = Cabin2), + distance(Cabin1, Cabin2, Distance, 1), + append(Visited, [Cabin2], Path). + +% recursive case +plan(Cabin1, Cabin2, Visited, Path, TotalDistance) :- + not(Cabin1 = Cabin2), + distance(Cabin1, CabinX, Distance, 1), + \+ member(CabinX, Visited), + append(Visited, [CabinX], NewVisited), + plan(CabinX, Cabin2, NewVisited, Path, SubDistance), + TotalDistance is Distance + SubDistance. diff --git a/assignment5/task1.pl b/assignment5/task1.pl new file mode 100644 index 0000000..e8e2ef4 --- /dev/null +++ b/assignment5/task1.pl @@ -0,0 +1,23 @@ +:- use_module(library(clpfd)). +:- initialization(main). + +main :- + findall([Ones,Fives,Tens,Twenties], + (payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]), label([Ones,Fives,Tens,Twenties])), + Solutions), + forall(member(Sol, Solutions), (write('Solution: '), writeln(Sol))). + +payment(Sum, Coins) :- + payment_acc(0, Sum, Coins). + +payment_acc(Acc, Sum, []) :- + Acc #= Sum. + +payment_acc(Acc, Sum, [coin(Count, Value, Available)|Tail]) :- + Count in 0..Available, + NewAcc #= Acc + Count * Value, + payment_acc(NewAcc, Sum, Tail). + +?- payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]). +?- payment(25, [coin(Ones,1,11),coin(Fives,5,4),coin(Tens,10,3),coin(Twenties,20,2)]), label([Ones, Fives, Tens, Twenties]). +