创建子集并仅使用每个原子一次
create subset and use each atom only once
我是 asp 的新人。我需要创建一组团队。每组必须由 3 个随机选择的团队组成。一个团队只能在一个组中。
提前致谢。这是我的代码
team(fener;galata;besik;van;adana;mardin).
neq(X,Y) :- X!=Y,team(X),team(Y).
count(C) :- C = #count{ T : team(T)}.
C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).
#show group/3.
可能的输出可能是
group(fener;besik;van) group(galata;mardin;adana)
我想,找到了解决办法。
team(fener;galata;besik;van;adana;mardin).
neq(X,Y) :- X!=Y,team(X),team(Y).
count(C) :- C = #count{ T : team(T)}.
C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).
exist_in_group(T) :- group(T,_,_).
exist_in_group(T) :- group(_,T,_).
exist_in_group(T) :- group(_,_,T).
:- team(T), not exist_in_group(T).
#show group/3.
输出:
clingo version 5.0.0
Solving...
Answer: 1
group(besik,fener,adana) group(galata,mardin,van)
SATISFIABLE
Models : 1+
Calls : 1
Time : 0.011s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
你想要的输出是不可能的:
group(a;b;c).
意味着:
group(a). group(b). group(c).
可能的输出是:
group(a,b,c).
但是ASP对可变参数原子或列表元素作为参数并不是很友好。一个更简单的管理输出是:
group(1,a). group(1,b). group(1,c).
而且这很容易生成,并且可以让我们避免昂贵的 #count
:
% Data
#const nb_group=2.
group(1..nb_group).
team(fener;galata;besik;van;adana;mardin).
% Assign 3 teams to each group
3{ group(G,T): team(T) }3 :- group(G).
% Two (almost) equilavent constraints:
1{ group(G,T): group(G) }1:- team(T). % a team is in only one group
OR
:- team(T) ; not group(_,T). % a team has no group
我是 asp 的新人。我需要创建一组团队。每组必须由 3 个随机选择的团队组成。一个团队只能在一个组中。
提前致谢。这是我的代码
team(fener;galata;besik;van;adana;mardin).
neq(X,Y) :- X!=Y,team(X),team(Y).
count(C) :- C = #count{ T : team(T)}.
C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).
#show group/3.
可能的输出可能是
group(fener;besik;van) group(galata;mardin;adana)
我想,找到了解决办法。
team(fener;galata;besik;van;adana;mardin).
neq(X,Y) :- X!=Y,team(X),team(Y).
count(C) :- C = #count{ T : team(T)}.
C/3 {group(X,Y,Z):team(X),team(Y),team(Z), neq(X,Y),neq(X,Z),neq(Z,Y) } C/3 :- count(C).
exist_in_group(T) :- group(T,_,_).
exist_in_group(T) :- group(_,T,_).
exist_in_group(T) :- group(_,_,T).
:- team(T), not exist_in_group(T).
#show group/3.
输出:
clingo version 5.0.0
Solving...
Answer: 1
group(besik,fener,adana) group(galata,mardin,van)
SATISFIABLE
Models : 1+
Calls : 1
Time : 0.011s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
你想要的输出是不可能的:
group(a;b;c).
意味着:
group(a). group(b). group(c).
可能的输出是:
group(a,b,c).
但是ASP对可变参数原子或列表元素作为参数并不是很友好。一个更简单的管理输出是:
group(1,a). group(1,b). group(1,c).
而且这很容易生成,并且可以让我们避免昂贵的 #count
:
% Data
#const nb_group=2.
group(1..nb_group).
team(fener;galata;besik;van;adana;mardin).
% Assign 3 teams to each group
3{ group(G,T): team(T) }3 :- group(G).
% Two (almost) equilavent constraints:
1{ group(G,T): group(G) }1:- team(T). % a team is in only one group
OR
:- team(T) ; not group(_,T). % a team has no group