我基本上是答案集编程(CLINGO)的初学者,所以我已经尝试这个问题好几个小时了。
人(a;b;c;d;e;f)。
喜欢(b,e;d,f)。
不喜欢(a,b;c,e)。
喜欢的人必须在同一个集合,不能和不喜欢的人在同一个集合。所以输出应该是: b,e | a, c, d, f
我知道它背后的逻辑;对它进行分区,以便如果一个元素同时处于喜欢和不喜欢的状态,那么它应该在自己的集合中,而其他所有元素都在另一个集合中。但这是声明式编程,所以我不确定如何解决这个问题。任何帮助,将不胜感激。
我基本上是答案集编程(CLINGO)的初学者,所以我已经尝试这个问题好几个小时了。
人(a;b;c;d;e;f)。
喜欢(b,e;d,f)。
不喜欢(a,b;c,e)。
喜欢的人必须在同一个集合,不能和不喜欢的人在同一个集合。所以输出应该是: b,e | a, c, d, f
我知道它背后的逻辑;对它进行分区,以便如果一个元素同时处于喜欢和不喜欢的状态,那么它应该在自己的集合中,而其他所有元素都在另一个集合中。但这是声明式编程,所以我不确定如何解决这个问题。任何帮助,将不胜感激。
试试这个,它应该适合你:
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 在不同的组中。