ex5: task 2.1

This commit is contained in:
2025-11-05 08:58:15 +01:00
parent 61b5f5abed
commit 729f98e140
2 changed files with 53 additions and 13 deletions

View File

@@ -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.

23
assignment5/task1.pl Normal file
View File

@@ -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]).