Prolog 使用CLP获取时间间隔

Prolog 使用CLP获取时间间隔,prolog,clpfd,Prolog,Clpfd,我希望在prolog环境中获得变量域的非中断间隔 例如,我有一个变量X,它被限制在它的域中取一些值。假设X有一个初始域[0..20],它被限制(不)有5、8、9作为值。因此X有了新的域[0..4,6,7,10..20]。我想以列表的形式获取此域中的非中断间隔[[0..4],[6,7],[10..20] 在SWI Prolog中,运行以下目标时使用clpfd库: X in 0..20, X #\= 5, X #\= 8, X #\= 9. 答案是: X in 0..4\/6..7\/10..20

我希望在prolog环境中获得变量域的非中断间隔

例如,我有一个变量X,它被限制在它的域中取一些值。假设X有一个初始域
[0..20]
,它被限制(不)有
5
8
9
作为值。因此X有了新的域
[0..4,6,7,10..20]
。我想以列表的形式获取此域中的非中断间隔
[[0..4],[6,7],[10..20]

在SWI Prolog中,运行以下目标时使用clpfd库:

X in 0..20, X #\= 5, X #\= 8, X #\= 9.
答案是:

X in 0..4\/6..7\/10..20.
到目前为止还不错。但我不知道如何才能得到这个域作为一个间隔列表。有办法吗



也欢迎使用其他Prolog实现及其各自的CLP/FD库的解决方案。

使用
FD_dom/2
,可以获取变量的域。然后可以使用a来解析域,其形式为
L1..U1\/L2..U2\/…

SWI Prolog manual()中给出了将域作为整数列表获取的示例DCG规则。稍加修改即可获得间隔:

dom_intervals(Dom, Intervals) :- phrase(dom_intervals1(Dom), Intervals).

dom_intervals1(I)           -->  {integer(I)}, [I].
dom_intervals1(L..U)        --> [L..U].
dom_intervals1(D1 \/ D2)    --> dom_intervals1(D1), dom_intervals1(D2).
最后,可以使用此查询:

0..20中的X,X\\=5,X\\=8,X\\=9,fd\u dom(X,D),dom\u间隔(D,间隔)。



虽然在YAP prolog中没有提到clpfd,但也可以在YAP prolog中提到clpfd。

您需要将术语映射到首选表示形式。我不知道如何进行您提到的映射。我能得到的最接近的答案是:
?-X在0..20,X在5,X在8,X在9,fd在dom(X,dom),dom=T1\/T2\/T3。
答案是
dom=0..4\/6..7\/10..20,T1=0..4,T2=6..7,T3=10..20,X在0..4\/6..7\/10..20。
我如何应用它,不知道连续间隔的数量?请阅读手册!它已经包含了一个如何将域映射到所有可能值的列表的示例。您应该能够将该定义应用到所需的表示形式中。对于0..20中的
X,X\\=5,X\\=7,X\\=8等单个值,您希望如何转换手册中的示例。