wip: prolog solver
This commit is contained in:
48
test.pl
Normal file
48
test.pl
Normal file
@@ -0,0 +1,48 @@
|
||||
% Player role definitions
|
||||
player_role(joe, setter).
|
||||
player_role(joe, middle).
|
||||
player_role(alice, libero).
|
||||
player_role(alice, outside).
|
||||
player_role(bob, middle).
|
||||
player_role(bob, outside).
|
||||
player_role(gleichmitte, middle).
|
||||
|
||||
% Dynamic predicate to store assignments
|
||||
:- dynamic assigned_role/2.
|
||||
|
||||
% Clear previous assignments
|
||||
clear_assignments :- retractall(assigned_role(_, _)).
|
||||
|
||||
% Assign roles to players
|
||||
assign_roles([]).
|
||||
assign_roles([Player|Rest]) :-
|
||||
player_role(Player, Role),
|
||||
assertz(assigned_role(Player, Role)),
|
||||
assign_roles(Rest).
|
||||
|
||||
% Check if the team is valid
|
||||
valid_team(Team) :-
|
||||
aggregate_all(count, (member(Player, Team), assigned_role(Player, setter)), 1),
|
||||
aggregate_all(count, (member(Player, Team), assigned_role(Player, libero)), 1),
|
||||
aggregate_all(count, (member(Player, Team), (assigned_role(Player, middle); assigned_role(Player, outside))), 2).
|
||||
|
||||
% Find all valid role assignments for a team
|
||||
find_valid_team(Team, ValidAssignments) :-
|
||||
findall(Assignments, (
|
||||
clear_assignments,
|
||||
assign_roles(Team),
|
||||
valid_team(Team),
|
||||
findall(Player-Role, assigned_role(Player, Role), Assignments)
|
||||
), ValidAssignments).
|
||||
|
||||
% Example team
|
||||
team([joe, alice, bob, gleichmitte]).
|
||||
|
||||
% Find and print all valid assignments
|
||||
solve :-
|
||||
team(Team),
|
||||
find_valid_team(Team, ValidAssignments),
|
||||
writeln('Valid assignment:'),
|
||||
writeln(ValidAssignments),
|
||||
fail.
|
||||
solve :- writeln('No more valid assignments.').
|
||||
Reference in New Issue
Block a user