diff --git a/assignment5/main.pl b/assignment5/main.pl index 7b503af..5f6f26b 100644 --- a/assignment5/main.pl +++ b/assignment5/main.pl @@ -1,54 +1,4 @@ -:- use_module(library(clpfd)). -:- initialization(main). - -main :- - writeln('task 2.1'), - findall([Path, TotalDistance], (plan(c1, c2, Path, TotalDistance)), Solutions), - forall(member([Path, Distance], Solutions), ( - atomic_list_concat(Path, ' -> ', PathStr), - format('Solution: ~w (distance: ~w)~n', [PathStr, Distance]) - )), - writeln('task 2.2'), - findall([Path, TotalDistance], (bestplan(c1, c2, Path, TotalDistance)), BestSolutions), - forall(member([Path, Distance], BestSolutions), ( - atomic_list_concat(Path, ' -> ', PathStr), - format('Solution: ~w (distance: ~w)~n', [PathStr, Distance]) - )). - - -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). - -% task 2.1 - -% arity 4 predicate -plan(Cabin1, Cabin2, Path, TotalDistance) :- - plan(Cabin1, Cabin2, [Cabin1], Path, TotalDistance). - -% 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. - -% task 2.2 - -bestplan(Cabin1, Cabin2, ShortestPath, ShortestDistance) :- - findall([Path, Distance], (plan(Cabin1, Cabin2, Path, Distance)), Solutions), - sort(2, @=<, Solutions, [ShortestSolution|_]), - [ShortestPath, ShortestDistance] = ShortestSolution. - +:- use_module(task1). +:- use_module(task2). +main :- task1:main, task2:main. +:- initialization(main, main). diff --git a/assignment5/task1.pl b/assignment5/task1.pl index e8e2ef4..3f8a3bd 100644 --- a/assignment5/task1.pl +++ b/assignment5/task1.pl @@ -1,7 +1,8 @@ +:- module(task1, []). :- use_module(library(clpfd)). -:- initialization(main). main :- + writeln('task 1'), 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), @@ -18,6 +19,6 @@ payment_acc(Acc, Sum, [coin(Count, Value, Available)|Tail]) :- 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]). +% ?- 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]). diff --git a/assignment5/task2.pl b/assignment5/task2.pl new file mode 100644 index 0000000..8a361d3 --- /dev/null +++ b/assignment5/task2.pl @@ -0,0 +1,54 @@ +:- module(task2, []). +:- use_module(library(clpfd)). + +main :- + writeln('task 2.1'), + findall([Path, TotalDistance], (plan(c1, c2, Path, TotalDistance)), Solutions), + forall(member([Path, Distance], Solutions), ( + atomic_list_concat(Path, ' -> ', PathStr), + format('Solution: ~w (distance: ~w)~n', [PathStr, Distance]) + )), + writeln('task 2.2'), + findall([Path, TotalDistance], (bestplan(c1, c2, Path, TotalDistance)), BestSolutions), + forall(member([Path, Distance], BestSolutions), ( + atomic_list_concat(Path, ' -> ', PathStr), + format('Solution: ~w (distance: ~w)~n', [PathStr, Distance]) + )). + + +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). + +% task 2.1 + +% arity 4 predicate +plan(Cabin1, Cabin2, Path, TotalDistance) :- + plan(Cabin1, Cabin2, [Cabin1], Path, TotalDistance). + +% 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. + +% task 2.2 + +bestplan(Cabin1, Cabin2, ShortestPath, ShortestDistance) :- + findall([Path, Distance], (plan(Cabin1, Cabin2, Path, Distance)), Solutions), + sort(2, @=<, Solutions, [ShortestSolution|_]), + [ShortestPath, ShortestDistance] = ShortestSolution. +