Prolog 序言中的CLP(B)加权sat_计数/3

Prolog 序言中的CLP(B)加权sat_计数/3,prolog,swi-prolog,sat,clp,clpb,Prolog,Swi Prolog,Sat,Clp,Clpb,对于SWI Prolog的CLP(B)库, 我想实现一个加权版本的 我没有找到用于修改代码的库的详细文档。 如何实现sat_count/2的加权版本 编辑1(2017年11月1日): 谢谢@mat的回复,我无法添加评论,因为我没有足够的声誉 weighted_sat_count/3应该包含一组权重,每个变量一个权重(一个权重表示True,一个权重表示False状态),然后其他两个参数与sat_count/2相同 计数是每个可容许赋值的权重之和。每个可容许赋值的权重是每个变量权重的乘积 计算结果

对于SWI Prolog的CLP(B)库, 我想实现一个加权版本的

我没有找到用于修改代码的库的详细文档。 如何实现sat_count/2的加权版本


编辑1(2017年11月1日)

谢谢@mat的回复,我无法添加评论,因为我没有足够的声誉

weighted_sat_count/3
应该包含一组权重,每个变量一个权重(一个权重表示True,一个权重表示False状态),然后其他两个参数与
sat_count/2
相同

计数是每个可容许赋值的权重之和。每个可容许赋值的权重是每个变量权重的乘积

计算结果的算法为:

bdd_weight(BDD_node)
 if BDD_node is 1-terminal return 1
 if BDD_node is 0-terminal return 0
 t_child <- 1-child of BDD_node
 f_child <- 0-child of BDD_node
 return (weight[BDD_node, 1] * bdd_weight(t_child) + weight[BDD_node, 0] * bdd_weight(f_child))


一个基于修改简单sat解算器另一部分的无效解决方案,从查看更简单的计数代码开始:

% my_sat_count(+List, -Integer)
my_sat_count([X|L], C) :-
   findall(D, (X=0, my_sat_count(L,D); 
               X=1, my_sat_count(L,D)), H),
   sum_list(H, C).
my_sat_count([], 1).

% sum_list(+List, -Number)
sum_list([D|L], C) :-
   sum_list(L, H),
   C is D+H.
sum_list([], 0).
为了验证这段简单代码的有效性,让我们举个例子(可以在SWI Prolog或带有Minlog扩展名的Jekejeke Prolog中运行):

现在,添加权重是一个简单的扩展,如下所示:

% my_weighted_sat_count(+List, +Pairs, -Float)
my_weighted_sat_count([X|L], [(P,Q)|R], C) :-
   findall(D, (X=0, my_weighted_sat_count(L,R,J), D is P*J; 
               X=1, my_weighted_sat_count(L,R,J), D is Q*J), H),
   sum_list(H, C).
my_weighted_sat_count([], _, 1.0).
以下是一些运行示例:

?- sat(X#Y#Z), my_weighted_sat_count([X,Y,Z],
                    [(0.5,0.5),(0.4,0.6),(0.3,0.7)],W).
W = 0.5
?- sat(X#Y#Z), my_weighted_sat_count([X,Y,Z],
                    [(0.3,0.7),(0.3,0.7),(0.3,0.7)],W).
W = 0.532

能否请您添加一个简短的描述和加权计数结果的示例?什么是输入等。?是否有参考文献,例如使用这种方法的论文?如果可能,请将其添加到问题中。根据要求,我编辑了带有输入和输出的主要问题。@mat在选择clp(b)作为prolog考试的兴趣区域后,我必须开发此问题。
Jekejeke Prolog 2, Runtime Library 1.2.5
(c) 1985-2017, XLOG Technologies GmbH, Switzerland
?- use_module(library(finite/clpb)).
% 8 consults and 0 unloads in 93 ms.
Yes
?- sat(X#Y#Z), labeling([X,Y,Z]).
X = 0, Y = 0, Z = 1 ;
X = 0, Y = 1, Z = 0 ; 
X = 1, Y = 0, Z = 0 ; 
X = 1, Y = 1, Z = 1
?- sat(X#Y#Z), my_sat_count([X,Y,Z],N).
N = 4,
% my_weighted_sat_count(+List, +Pairs, -Float)
my_weighted_sat_count([X|L], [(P,Q)|R], C) :-
   findall(D, (X=0, my_weighted_sat_count(L,R,J), D is P*J; 
               X=1, my_weighted_sat_count(L,R,J), D is Q*J), H),
   sum_list(H, C).
my_weighted_sat_count([], _, 1.0).
?- sat(X#Y#Z), my_weighted_sat_count([X,Y,Z],
                    [(0.5,0.5),(0.4,0.6),(0.3,0.7)],W).
W = 0.5
?- sat(X#Y#Z), my_weighted_sat_count([X,Y,Z],
                    [(0.3,0.7),(0.3,0.7),(0.3,0.7)],W).
W = 0.532