prolog - Prolog DCG 选择不同的项目
问题描述
我正在尝试编写一个 prolog DCG 以在列表中选择 2 种不同的颜色,请参见下面的代码。
colour --> [red].
colour --> [blue].
colour --> [green].
...
pick2colours -->
colour,
colour.
% I would like to return 2 distinct colours
代码的实际版本不保证这两种颜色是不同的。我不知道如何解决这个问题。
解决方案
有什么理由要使用语法规则而不是子句?
Logtalk 和一些 Prolog 系统提供了一个select/3
库谓词,可以轻松解决这个问题。例如:
| ?- select(Color1, [red,green,blue], Remaining),
select(Color2, Remaining, _).
Color1 = red,
Remaining = [green, blue],
Color2 = green ;
Color1 = red,
Remaining = [green, blue],
Color2 = blue ;
Color1 = green,
Remaining = [red, blue],
Color2 = red ;
Color1 = green,
Remaining = [red, blue],
Color2 = blue ;
Color1 = blue,
Remaining = [red, green],
Color2 = red ;
Color1 = blue,
Remaining = [red, green],
Color2 = green ;
no
但请注意,如果您认为与...Color1 + Color2
相同,您将获得(通过回溯)重复的解决方案Color2 + Color1
推荐阅读
- ios - 无法从 xcode 中的模块“(null)”加载自定义类“GameScene”
- c++ - 如何获得数字上下控制?
- android - Android:如何在 iText 生成的 PDF 中将 url 图像添加到我的标题中
- jhipster - 如何定义模型规范文件?
- javascript - 在 React 中,如何使用复选框创建一个灵活的选定项目数组,类似于在我的手机上选择图像?
- c# - 当游戏窗口没有使用 Unity 输入系统聚焦时,如何避免输入检测?
- python - 必须以什么格式发送 ICE 候选人以在两个对等方之间建立连接?
- java - 这是否是动态多态性?
- html - Twitter bootstrap flex 垂直中心不能使用 align-self-center
- python - psycopg2 copy_from--忽略标题?