我正在使用以下 SWI-Prolog 版本:
SWI-Prolog version 9.1.2 for x86_64-linux
。
我正在尝试使用 Prolog 和 CLP(FD) 模块来计算有效解决方案的数量。目前,为了计算有效解决方案的数量,我按以下方式使用
findall/3
谓词:
findall(1, labeling([max, up, enum], Flat), CountList),
length(CountList, Count),
这可行,但如果解决方案数量较多(> 1.000.000),它就会开始变慢。我想这是因为我本质上所做的是生成所有解决方案,而不是从变量的有效域中推理它。我认为创建一个包含数百万个元素的列表也没有帮助。
有没有一种方法只计算 CLP(FD) 中N变量的可能解决方案的数量,而不生成它们?
我尝试使用 FD 集合谓词:fd_set/2
和
fdset_size/2
,并将所有变量的 FD 集合大小相乘。问题是我得到的 FD 集大小没有考虑 FD 交集,因此解数太高。我还尝试使用 CLP(B) 模块中的
sat_count/2
谓词,但我无法正确使用它,因为它对布尔变量进行推理,而我的变量是整数,因此从这段代码来看:
sat_count(+[1|Variables], Count),
我收到以下错误消息:
ERROR: Domain error: `clpb_expr' expected, found `+[1,0,0,2,2,4,6,8,8,10,10,12,14,16,16,18,18,20,22,24,24,26,26,28,30,32,32,34,34,36,38]'
所以我假设我应该将每个变量转换为布尔表达式,以便这些表达式的 sat 计数之和等于我使用 labeling/2
获得的有效解决方案的数量,但我不确定如何实现。