这是Can you use clpfd to implement a coverage algorithm?
的后续问题我已将代码放在此处:http://swish.swi-prolog.org/p/Coverage%20using%20Constraints%20%20.pl
有两种搜索程序。
start_exhaustive_search(Positives,Negatives,r(Features, Value,cm(TP,FP)))
启发式搜索:
start_search(Ps,Ns,Result).
启发式搜索将细化规则,直到它不包含任何底片。 cm是混淆矩阵。
有三种方法可以测试谓词,其中一种方法可以使用pos(Ps)
和negs(Ns)
访问小型数据库。然后使用approved(Ps)
和notapproved(Ns)
访问更大的数据库。这也有一些谓词可以将使用过的要素的二进制表示形式转换为命名要素列表。binary_to_features(Binary,Features)
。
您还可以使用random_binary_matrix_x_y(X,Y,R)
生成示例的随机矩阵(使用X作为9,结果将与更大的已批准/未批准的示例兼容)。
详尽的查询示例:
?-approved(Ps),notapproved(Ns),start_exhaustive_search(Ps,Ns,Result).
Result = r([0, 0, 0, 0, 0, 0, 0, 1, 0, 0], 21, cm(6, 1)).
示例启发式查询:
?-approved(Ps),notapproved(Ns),start_search(Ps,Ns,Result).
Result = [r([0, 0, 0, 0, 0, 0, 0, 1, 0, 0], 21, cm(6, 1)), r([0, 0, 0, 0, 0, 0, 0, 1, 0, 1], 20, cm(4, 0))]
因此,两种方法似乎都没有我想象的那样快,可能使用约束。有没有办法提高速度?
另外我很好奇为什么我不能使用dif / 2但是必须在第98行使用\ ==?
我使用card / 2来计算所涵盖的示例数量,我无法看到另一种方法来使用它?