prolog - 求解器:用于“简单”逻辑问题的 OR-Tools 或 cligo(ASP) 模型
问题描述
我尝试用 OR-Tools 或 cligo(ASP) 解决一个“简单”的逻辑问题。它是这样的:我有一组像Person(Tony, Bob, Ann, Carl, Amber, Peter)这样的人 我也有像Group1(Bob, Ann, Carl, Amber, Peter) , Group2(Bob, Amber)这样的组, 和Group3(Amber)。现在我想从 Group1 中选择两个人,从 Group2 中选择一个人,从 Group3 中选择一个人 - 所以总共有四个人满足所有约束。可能的解决方案是Carl, Ann, Bob, Amber或Peter, Ann, Bob, Amber或Carl, Peter, Bob, Amber。我怎样才能做到这一点?
编辑:我在 ASP cligo 中试过这个:
person(tony; bob; ann; carl; amber; peter).
group1(bob; ann; carl; amber; peter).
group2(bob; amber).
group3(amber).
% rules
{select(X): person(X), group1(X)} = 2.
{select(X): person(X), group2(X)} = 1.
{select(X): person(X), group3(X)} = 1.
#show select/1.
但我只得到:
clingo version 5.5.0
Reading from stdin
Solving...
Answer: 1
select(amber) select(carl)
Answer: 2
select(amber) select(peter)
Answer: 3
select(amber) select(ann)
SATISFIABLE
Models : 3
Calls : 1
Time : 0.004s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
谢谢并恭祝安康
解决方案
您在 ASP 中完美地阐述了您描述的问题,它显示了正确的结果。您忘记说明的是您不想从两个不同的组中选择同一个人。
我将您的 ASP 程序修改为以下内容:
person(tony; bob; ann; carl; amber; peter).
group1(bob; ann; carl; amber; peter).
group2(bob; amber).
group3(amber).
% select the amount for each group individually
{select(1,X): group1(X)} = 2.
{select(2,X): group2(X)} = 1.
{select(3,X): group3(X)} = 1.
% you are not allowed to select a person in two groups
:- select(G,X), select(G',X), G < G'.
#show .
#show select(X) : select(G,X).
这给出了您预期的答案。
推荐阅读
- node.js - npm install bootstrap@4.0.0 命令给出 ENETUNREACH 错误
- python - 如何编码分类预测值?
- java - 根据字符串的不同模式拆分字符串
- json - 我有嵌套的列表对象,称为 JSON 中的剧集,那么如何根据 id 父对象而不是位置对象获取剧集列表?
- python - 数据框中的字符串编辑不使用 .replace 代码生效
- django - 如何使用 django.utils.timezone 库将日期时间从特定时区转换为其 UTC 版本?
- python - 将一个大的 numpy 数组转换为字符串
- mysql - Mysql更新多行
- angular - Angular 8 - 没有访问控制允许请求的资源上存在 Origin 标头?
- django - 删除按钮表单标签导致换行