ex5: gather tasks in main.pl
This commit is contained in:
@@ -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).
|
||||
|
||||
@@ -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]).
|
||||
|
||||
|
||||
54
assignment5/task2.pl
Normal file
54
assignment5/task2.pl
Normal file
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user