wip: prolog solver

This commit is contained in:
eneller
2026-03-27 21:40:54 +01:00
parent bde0efa167
commit e209a9a73d
8 changed files with 161 additions and 22 deletions

48
test.pl Normal file
View 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.').