Программирование набора ответов: как распределить учащихся по группе таким образом, чтобы в одной группе не было двух учеников, которые не любят друг друга

Я новичок в программировании набора ответов. Я хочу сгруппировать всех учеников в разные группы так, чтобы: 1. В каждой группе было от 3 до 4 учеников. 2. В одной группе нет двух учеников, которые не любят друг друга. 3. И мы не можем назначать одного и того же ученика в разные группы.

Я написал как:

%suppose there are total 6 students 
student(1..6). 

%suppose there are 2 groups
group(1..2). 

%1 and 4 like each other, 4 and 5 dislike each other
dislike(1,4). dislike(5,4). 

% each group has 3 to 4 students 
:- group(G), #count {S : in(S,G)} < 3. 
:- group(G), #count {S : in(S,G)} > 4.

Я добавил ограничение на количество учеников в каждой группе, но понятия не имею, как выполнить два других условия.

Ваша помощь будет принята с благодарностью. Благодарю.

1 ответ

Решение

Попробуй это:

student(1..6). 
group(1..2). 

dislike(1,4). dislike(5,4). 


% each group has 3 to 4 students 
:- group(G), #count {S : in(S,G)} < 3. 
:- group(G), #count {S : in(S,G)} > 4.

%no two students who dislike each other are in the same group
:-in(X, G1), in(Y,G2), dislike(X,Y), group(G1), group(G2), G1==G2.

%each student should be assigned to only one group
1{in(S,G): group(G)}1 :- student(S).

#show in/2.
Другие вопросы по тегам