首页 > 解决方案 > Prolog DCG 选择不同的项目

问题描述

我正在尝试编写一个 prolog DCG 以在列表中选择 2 种不同的颜色,请参见下面的代码。

colour --> [red].
colour --> [blue].
colour --> [green].
...

pick2colours -->
    colour,
    colour.

% I would like to return 2 distinct colours

代码的实际版本不保证这两种颜色是不同的。我不知道如何解决这个问题。

标签: prologdcg

解决方案


有什么理由要使用语法规则而不是子句?

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


推荐阅读