0

我基本上是答案集编程(CLINGO)的初学者,所以我已经尝试这个问题好几个小时了。

人(a;b;c;d;e;f)。

喜欢(b,e;d,f)。

不喜欢(a,b;c,e)。

喜欢的人必须在同一个集合,不能和不喜欢的人在同一个集合。所以输出应该是: b,e | a, c, d, f

我知道它背后的逻辑;对它进行分区,以便如果一个元素同时处于喜欢和不喜欢的状态,那么它应该在自己的集合中,而其他所有元素都在另一个集合中。但这是声明式编程,所以我不确定如何解决这个问题。任何帮助,将不胜感激。

4

1 回答 1

0

试试这个,它应该适合你:

person(a;b;c;d;e;f). 
like(b,e; d,f).
dislike(a,b; c,e).

group(1..2). 

% every person belongs to one group only. 
1{in(S,G): group(G)}1 :- person(S).

% no two persons who do dislike each other are in the same group 
:- in(X, G), in(Y, G), dislike(X,Y). 

#show in/2.

你会得到的结果是:
a & b 在不同的组中。
和 c & e 在不同的组中。

你能得到的结果是这样的: 答案集编程:使用 cligo 分成两组

于 2016-02-10T03:13:28.530 回答