跳到内容
导航菜单
切换导航
登录
产品
行动
自动化任何工作流
包装
托管和管理包
安全
查找并修复漏洞
代码空间
即时开发环境
GitHub Copilot公司
使用AI编写更好的代码
代码审查
管理代码更改
问题
计划和跟踪工作
讨论
在代码外协作
探索
所有功能
文档
GitHub技能
博客
解决
按大小
企业
团队
创业公司
按行业划分
保健
金融服务
制造业
按用例
CI/CD和自动化
开发运营
DevSecOps公司
资源
话题
人工智能
开发运营
安全
软件开发
查看全部
探索
学习途径
白皮书、电子书、网络研讨会
客户案例
合作伙伴
开放源代码
GitHub赞助商
资助开源开发人员
ReadME项目
GitHub社区文章
存储库
话题
趋向
收藏
企业
企业平台
AI驱动的开发人员平台
可用附加组件
高级安全
企业级安全功能
GitHub Copilot公司
企业级AI功能
特优支持
企业级全天候支持
定价
搜索或跳转到。。。
搜索代码、存储库、用户、问题、推送请求。。。
搜索
清除
搜索语法提示
提供反馈
我们阅读了每一条反馈,并非常认真地对待您的意见。
包括我的电子邮件地址以便联系我
保存的搜索
使用保存的搜索更快地筛选结果
姓名
查询
要查看所有可用的限定符,请参阅我们的
文档
.
登录
注册
重置焦点
您使用另一个选项卡或窗口登录。
重新加载
刷新会话。
您在另一个选项卡或窗口中注销。
重新加载
刷新会话。
您在另一个选项卡或窗口上切换了帐户。
重新加载
刷新会话。
解除警报
{{消息}}
OKullmann公司
/
ok图书馆
公共
通知
您必须登录才能更改通知设置
福克
18
星星
32
代码
Pull请求
6
行动
项目
0
安全
洞察力
其他导航选项
代码
Pull请求
行动
项目
安全
洞察力
文件夹
主人
面包屑
ok库
/
可满足性
/
解算器
/
TawSolver公司
/
tawSolver.cpp
责备
责备
最新提交
历史
历史
2107行(1901个位置)·67.6 KB
主人
面包屑
ok图书馆
/
可满足性
/
解算器
/
TawSolver公司
/
tawSolver.cpp公司
顶部
文件元数据和控件
代码
责备
2107行(1901个位置)·67.6 KB
原始
1
2
三
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
********************************************************************
tawSolver——一种基本高效的DLL SAT求解器
版权所有(c)2007-2013 Tanbir Ahmed
http://users.encs.concordia.ca/
~塔哈迈德/
版权所有2013、2015、2016、2017、2018、2020、2021、2022、2024 Oliver Kullmann
网址:http://www.cs.swan.ac.uk/
~c奥利弗/
特此免费授予任何获得此软件副本的人以及
相关文档文件(“软件”),无限制地处理软件,
包括但不限于使用、复制、修改、合并、发布、分发、,
再许可和/或销售软件副本,并允许软件的使用者
根据以下条件提供:
所有副本或
软件的主要部分。
本软件按“原样”提供,不提供任何形式的明示或暗示担保,包括但
不限于适销性、特定用途适用性和
非侵权。
在任何情况下,作者或版权持有人均不对任何索赔负责,
无论是合同诉讼、侵权诉讼还是其他诉讼中由以下原因引起的损害赔偿或其他责任:
属于或与软件有关,或在软件中使用或进行其他交易。
*********************************************************************
*/
/*
使用
年开发的look-ahead启发式理论
分支启发式基础,可满足性手册,第7章
网址:http://cs.swan.ac.uk/
~csoliver/papers.html#Handbook2009基金会
https://doi.org/10.3233/978-1-58603-929-5-2005
此实现在中进行了讨论
关于范德华登数w(2;3,t)
网址:http://www.cs.swan.ac.uk/
~csoliver/papers.html#VDW232011
http://dx.doi.org/10.1016/j.dam.2014.05.007
原始DLL算法来自
理论证明的机器程序
https://doi.org/10.1145/368273.368557
维基百科页面
https://en.wikipedia.org/wiki/DPLL_algorithm
包含一些历史错误(例如,“DLL”是唯一正确的名称
对于此特殊算法),但在其他方面是合理的。
使用编译
>g++--std=c++11-墙-Ofast-DNDEBUG-o tawSolver tawSolver.cpp
可能有其他优化选项
-funroll-loops-funsafe-loop-optimizations-fno-math-errno
-funsafe-math-优化-fwhole-program
或使用
>g++--标准=c++11-墙-g-o tawSolver_debug tawSolver.cpp
用于调试。
使用下面的宏,可以进行许多编译变量;
主管道
另一种方法是计算所有解(由部分赋值表示),
通过以下方式获得(类似于上文)
>g++--std=c++11-墙-Ofast-DNDEBUG-DALL_SOLUTIONS-o ctawSolver tawSolver.cpp
或者,此中的生成文件(称为“生成文件”)
目录(OKlibrary的)
https://github.com/OKullmann/oklibrary网站
)
可以使用:它包含各种选项,但带有
>制造所有
它创建了四个版本
tawSolver、ttawSolver、ctawSolver和cttawSoller
其中前缀“t”代表“tau”,即替代启发式,而“c”
代表“计数”。
使用
>使所有
创建了四个额外的调试版本(名为“*deebug”)。
使用
>使干净
删除了调试版本,并带有
>制作清洁球
另外还有四个(优化的)程序。
用法:
>tawSolver[参数1][参数2][参数3]
-无参数显示用法并使用0退出
-with argument1=“-v”或“--version”显示信息并用0退出;
-argument1=filename或“-cin”运行SAT解算器,输入来自
文件或标准输入;
-使用argument2=文件名或“-cout”或“-cerr”或“-nil”解决方案
输出到文件、标准输出、标准错误或被忽略;
如果未给定argument2,则默认值为-cout,但以下情况除外
定义了ALL_SOLUTIONS,其中默认值为-nil;
-使用argument3=文件名或“-cout”或“-cerr”或“-nil”统计信息
输出到文件、标准输出、标准错误或被忽略;
如果定义了VAR_MARGINALS(包括ALL_SOLUTIONS),则在
变量对“v:count”的统计结束
输出,其中count是满足v=true的赋值数;
如果未给出argument3,则默认值为-cout。
输出到文件意味着附加。
输入中的空子句或单位子句是错误的(参见下文
关于如何消除单位条款的选项)。
p线中的参数被视为上限(因此未达到
它们不被视为错误),其中重言从句被忽略。
向程序发送SIGINT时(例如,通过CTRL-C从调用
终端),则输出当前统计状态,并进行计算
已中止。
发送SIGUSR1时,输出统计信息
继续计算。
以下宏用于控制编译:
-LIT_TYPE(默认标准::int32_t)
-WEIGHT_2、WEIGHT_4、WEIGHT_5、WEIGAT_6和WEIGHT_ABASIS_OPEN:
子句长度k=3的权重标准化为1
k=2,4,5,6由前四个宏给出
非预定权重(w.r.t.向量“权重”的初始化)
重复将最后一个预定重量除以
重量_基础_打开。
-UCP_STRATEGY(默认值1):0表示BFS处理,1表示DFS处理
单位条款。
-PURE_LITERALS:如果已定义(默认为未定义),则纯文本为
消除(当遇到它们时,不是迭代地)。
-TAU_ITERATION:如果已定义(默认值未定义),则原则上
更准确,但也更昂贵的τ函数作为投影(
);
如果是TAU_ITERATION,则为TWEIGHT_2、TWEIGHT_4、TWEIGHT_5、TWEILHT_6和
使用TWEIGHT_BASIS_OPEN。
-ALL_SOLUTIONS:如果已定义(默认为未定义),则所有解决方案都是
计算,一旦找到它们,就会立即输出;
与PURE_LITERALS不兼容。
-VAR_MARGINALS,这意味着ALL_SOLUTIONS表示统计信息
在每个变量的末尾列出满意的赋值数
其中,此变量设置为true。
-COUNT_T:ALL_SOLUTIONS情况下的计数类型;
默认情况下为未签名
具有至少64位的整数类型(因此执行模运算,
即模2^count_bits);
也可以定义为“双精度”或“长双精度”,在这种情况下
结果可能变成“inf”。
为了提供进一步的版本信息,有两个宏,它们是
只有在以下情况下才相关:
-GIT_ID(用于GIT存储库的标识哈希值)
-OKLIB(带有OKlibrary的url(不带前缀“http://”)。
统计输出备注:
-输入的(唯一)减少是删除重言从句,
重复文字的收缩;
报告的子句数,
maximal_clause_length和number_of_literal_occurrences指的是
这一减少的结果。
-p_param_variables是p线上的n值(作为上限
限制在输入中文字的最大绝对值上)。
-max_ocurring_variable是中文字绝对值的最大值
输入。
-“running_time(sec)”只是求解时间。
-running_time+reading-and-set-up_time是总时间。
-“二进制节点”是指具有(正好)两个子节点的节点。
-“1-约简”是由于单位子句传播而产生的赋值。
-“选项”总结了主要选项:
-“B”表示UCP_STRATEGY=0
-“P”代表PURE_LITERALS
-如果定义了“T”及其值
-“A”表示ALL_SOLUTIONS,加上“F”表示浮点计数,以及
后面是(十进制)位数。
-如果定义了VAR_MARGINALS,则不是“A”而是“M”。
如果solutions-output是cout,那么它位于统计数据之后,除了
定义ALL_SOLUTIONS的情况,其中自然会出现解决方案
在(最终)统计数据之前。
对于溶液计数,使用p_param_variables中报告的值
作为变量的数量。
例如,我们有
>echo“p cnf 63 0”|ctawSolver-cin
s满意
c最大发生变量0
c条款数量0
c最大子句长度0
c文字出现次数0
c运行时间(秒)0.00
c节点数1
c二进制节点数0
c减少次数0
c解决方案编号9223372036854775808
c读取和启动时间(秒)0.000
c p_param变量63
c p_param_clauses 0
c number_tautogies 0
c文件名-cin
c选项“A19”
也就是说,我们有零子句,但有2^63个解决方案:关键是
输入指定了63个变量(这里只是“形式”变量,
它们不会出现在输入中),并且由于没有子句
对它们没有任何限制。
对于超时T,T由超时实用程序(a)支持
浮点数,后缀为s(默认值)、m(分钟),
h(小时),d(天)),前缀为解算器调用(也可以是任意
tawSolver版本),并调用/
从这个开始
参数列表,例如超时0.1s,计数
解决方案,并使用random-CNF提取计数
发电机BRG(400个3条款,100个变量):
TawSolver>BRG“400*100,3”|/
初始0.1 ctawSolver-cin-nil |awk'/^c number_of_sol/'
c解决方案编号1408
为了消除单位条款,OKlibrary程序
可以使用UnitClausePropagation-O3-DNDEBUG(它不执行
任何重命名,并从p线更新n值和c值):
TawSolver>Pandiagonal 13“”|UnitClausePropagation-O3-DNDEBUG|TawSolver-cin-nil|awk'/^s/'
s满意
TawSolver>Pandiagonal 14“”|UnitClausePropagation-O3-DNDEBUG|TawSolver-cin-nil|awk'/^s/'
s不满意
备注:以上可以(自然)与tosigint结合。
目前,相应的部分分配不可用。
使用OKsolver执行完全r_2缩减(而不仅仅是r_1)
使任务可用。
最后一句话:当使用ctawSolver时,变量诱导中的间隙
事件(例如由UnitClausePropagation-O3-DNDEBUG创建的)。
程序RemoveVarGaps会删除这些。
考虑:
TawSolver>Pandiagonal 5“”|UnitClausePropagation-O3-DNDEBUG|ctawSolver-cin-nil|awk'/solutions/'
c解决方案数量0
这个结果来自差距,在这里创造了至少2^64的因子,
也就是说,0(64位无符号整数用于计数)。
正确的计数方法如下:
{5..13}中N的TawSolver>;
do echo-n“$n:”;
Pandiagonal$N“”|UnitClausePropagation-O3-DNDEBUG>TEMP.cnf;
删除VarGaps TEMP.cnf;
tosigint 2m ctawSolver TEMP.cnf-nil | awk'/solutions/';
rm温度.cnf;
完成
5:c溶液数量2
6:c解决方案数量0
7:c解决方案数量4
8:c个解决方案0
9:c解决方案数量0
10:c解决方案数量0
11:c解决方案数量8
12:c数量_解决方案0
13:c溶液数量1
*/
#
包括
<
限制
>
#
包括
<
矢量
>
#
包括
<
阵列
>
#
包括
<
iostream公司
>
#
包括
<
fstream(流)
>
#
包括
<
一串
>
#
包括
<
s流
>
#
包括
<
type_traits(打印_绘图)
>
#
包括
<
伊曼尼普
>
#
包括
<
例外
>
#
包括
<
算法
>
#
包括
<
计时手表
>
#
包括
<
cstdlib数据库
>
#
包括
<
数学库
>
#
包括
<
cstdint(cstdint)
>
#
包括
<
卡塞特
>
#
包括
<
c信号
>
命名空间
{
#
定义
是(_P)
(
X(X)
)标准::is_standard_layout_v
和
标准::is_trivil_v<X>
//
---一般输入和输出---
常数
标准::字符串版本=
"
2.20.3
"
;
常数
标准::字符串日期=
"
25.2.2024
"
;
#
如果
defined WEIGHT_2 | defined WEIGHT_4 | defineed WEIGHT_5 | defined-WEIGHT.6 | defined.WEIGHT_FASIS_OPEN | defined\TWEIGHT_2| definedTWEIGht_4 | efined TWEIGHT_5 | definitied TWEIGHT_6 | defined:TWEIGHTML _BASIS_OPEN
#
定义
重量_定义
#
结尾
#
条件编译
第一个变量
#
如果
定义的TAU_ITERATION |定义的LAMBDA |定义的ALPHA |定义的WEIGHT_defined
#
错误
“FIRST_VARIABLE与任何其他启发式选项不兼容。\n”
#
结尾
#
如果未定义
纯文学
#
错误
“FIRST_VARIABLE必须与PURE_LITERALS组合。\n”
#
结尾
#
结尾
常数
std::string程序=
#
如果
定义的ALL_SOLUTIONS
"
c(c)
"
#
否则如果
定义的VAR_MARGINALS
"
米
"
#
结尾
#
条件编译
TAU_地形
"
t吨
"
#
结尾
#
条件编译
第一个变量
"
(f)
"
#
结尾
"
tawSolver(茶色解算器)
"
#
条件编译
重量_定义
"
_瓦
"
#
结尾
#
条件编译
兰巴达
"
_λ
"
#
结尾
#
条件编译
阿尔法
"
_阿尔法
"
#
结尾
#
如果未定义
NDEBUG公司
"
_调试
"
#
结尾
;
枚举
错误代码(_co){
文件读取错误=
1
,
文件写入错误=
2
,
文件行错误=
三
,
num_vars_error(数值_变量_错误)=
4
,
分配错误=
5
,
文字_读取_错误=
6
,
变量值错误=
7
,
number_clauses_error(错误)=
8
,
空条款错误=
9
,
单位条款错误=
11
};
//
以下三个返回值不是错误:
枚举
结果值{未设置=
20
,已坐=
10
,未知=
0
};
类型定义
布尔
DLL_return_t;
内联
常量表达式
结果_值
解释_运行
(
常数
DLL_return_t结果)
无例外
{
返回
结果如何?
sat:未设置;
}
/*
初始化输出对象solout、logout、errout的类
通过命令行参数中的函数setoutput。
二者
公共成员(除了构造函数)是
输出<<x;
out.endl();
它将输出发送到内部存储的ostream*p(如果设置)。
析构函数删除*p iff成员del=true。
*/
班
输出
{
标准::ostream*p=
空指针
;
布尔
德尔=
假
;
朋友
空隙
设置输出
(
常数
整数
,
常数
烧焦
*
常数
*);
朋友
班
输出装置
;
公众:
布尔
积极的
()
常数
无例外
{
返回
p=
空指针
; }
~输出
() {
如果
(删除)
删除
p、 }
模板
<
类别名
时间>
常数
输出&
操作人员
<<(
常数
T&x)
常数
{
如果
(p) *p<<x;
返回
*
这
; }
空隙
端部
()
常数
{
如果
(p) {*p<<
"
\n个
"
;
p->
脸红
();} }
标准::流大小
精度
(
常数
标准::流大小pr)
常数
无例外
{
断言
(p) ;
返回
p->
精度
(公关);
}
};
输出解决方案;
输出注销;
//
带有Error-prefix的错误输出,每个输出都位于新行上:
结构
输出装置
:输出{
常数
标准::字符串e=
"
错误[
"
+程序+
"
]:
"
;
模板
<
类别名
时间>
常数
输出装置&
操作人员
<<(
常数
T&x)
常数
{
如果
(p) *p<<e<<x<<
"
\n个
"
;
返回
*
这
;
}
};
输出错误;
//
---文字和变量的数据结构---
/*
基本类是Var(变量)和Lit(文字),其中
Lit包含Lit_int,“Literals as integers”,它是有符号整数,
变量是无符号的。
极性pos、neg通过枚举类型“极性”表示。
Lit_int x、Lit y、y’、Var v、Polarity p的操作:
-Lit()(单数文字)
-复制构造,Lit赋值
-Lit(x)(非转换)
-光(v,p)
-布尔(y)(显式;真iff x不是单数)
--y,-p
-y==y',y!=
是的'
-var(y)(产生var)
-符号(y)(表示极性)
-ostream公司
Lit-literals由n_l为无符号long-long n构造。
*/
#
如果未定义
LIT_类型
#
定义
LIT_类型
标准::
整数32_t
#
结尾
类型定义
LIT_TYPE灯_ int;
统计_断言
(标准::is_signed<Lit_int>::value,
"
类型
\"
照明(_I)
\"
必须是有符号整数。
"
);
统计_断言
(
大小
(亮起)=
1
,
"
Lit_int=char(或int8_t)不适用于读取(因为读取的不是数字,而是字符)。
"
);
常量表达式
Lit_int max_Lit=标准::numeric_limits<Lit_int>::max();
统计_断言
(--max_lit==最大值,
"
求反max_lit时出现问题。
"
);
类型定义
标准::make_unsigned<Lit_int>::类型Var;
统计_断言
(Lit_int(Var(max_Lit))==max_Lit,“Var和Lit_int有问题”);
内联
常量表达式
布尔
有效的
(
常数
变量v)
无例外
{
返回
v(v)<=
变量
(最大值);}
枚举
极性{pos=
0
,阴性=
1
};
内联
常量表达式
极性
操作人员
-(
常数
极性p)
无例外
{
返回
(p==位置)?
阴性:阳性;
}
班
点燃
{
升(_int)x;
公众:
点燃
() =
违约
;
常量表达式
明确的
点燃
(
常数
点亮x)
无例外
:x(x){}
常量表达式
点燃
(
常数
变量v,
常数
极性p)
无例外
:x(p==pos?v:-Lit_int(v)){}
常量表达式
明确的
操作人员
布尔
()
常数
无例外
{
返回
x、 }
常量表达式
点燃
操作人员
-()
常数
无例外
{
返回
点燃
(-x);}
常量表达式
布尔
操作人员
==(
常数
点亮)
常数
无例外
{
返回
x==y。
x个
; }
常量表达式
布尔
操作人员
!=
(
常数
点亮)
常数
无例外
{
返回
x!=
年。
x个
; }
朋友
常量表达式
变量
无功功率,无功功率
(
常数
点亮x)
无例外
{
返回
标准::abs
(x)。
x个
); }
朋友
常量表达式
极性
签名
(
常数
点亮x)
无例外
{
返回
(x)。
x个
>=
0
) ?
位置:否定;}
朋友
标准::ostream&
操作人员
<<(标准::ostream&out,
常数
点亮x){
返回
输出<<x。
x个
;
}
朋友
标准::istream&
操作人员
>>(标准::istream(&I),Lit(&x)){
返回
英寸>>x。
x个
;
}
};
统计_断言
(is_pod(亮),
"
发光不是POD。
"
);
内联
常量表达式
点燃
操作人员
"
"
_我(
常数
未签名的
长的
长的
x)
无例外
{
返回
点燃
(x) ;}
统计_断言
(0_1==升(),
"
Lit的默认构造存在问题。
"
);
//
备注:通常,作为局部变量,声明“Lit x;”不
//
初始化x。
统计_断言
(1_l==升(
1
)
和
-1_l==升(-
1
),
"
Lit.结构问题。
"
);
统计_断言
(
不
0_l,
"
将单数字面转换为布尔的问题。
"
);
统计_断言
(1升
和
-1升,
"
将有效文本转换为bool时出现问题。
"
);
统计_断言
(1_l!=-1.l,
"
否定和/或不等式问题。
"
);
统计_断言
(--1_l==1_l,
"
双重否定的问题。
"
);
统计_断言
(0_l==-0_l,
"
单数字面否定的问题。
"
);
统计_断言
(变量(-1_1)==
1
,
"
var()有问题。
"
);
统计_断言
(符号(-1_l)==否定,
"
sign()出现问题。
"
);
统计_断言
(1_l==升(
1
,位置)
和
-1_l==升(
1
,否定),
"
极性问题。
"
);
类型定义
标准::vector<Lit>Lit_vec;
//
---子句的数据结构---
/*
条款有
-类型Weight_t的静态权重
-以及Clause_index类型的静态索引。
计数子句通过无符号整数类型Count_clauses发生
全局变量r子句给出了当前仍处于活动状态的
条款。
子句是静态的,除了它们
-当前状态(长度>=1的满足或仍然有效)
-以及当前长度(如果有效),
保持不变。
因此,主要的数据结构“大多是懒惰的”。
查看当前子句的内容
实际上,必须考虑static(原始)子句和current
部分分配——除了处理长度和满意度
“急切”,也就是说,保持最新。
类子句表示单个子句,作为范围
-begin()和
-end()。
其他公众成员
-Clause_index类型的length(),
-以及显式转换bool(),用于激活(true)或满足,
即,不活动(false)。
对于更改,有私有成员函数
-decrement()(“删除”伪造的文字)
-increment()(撤消对篡改的文字的“删除”)
-deactivate()(已满足)
-activate()(撤消停用)。
注意,它们只影响长度和状态(对于后两个函数)。
通过<<输出子句。
子句通常通过指针处理,而ClauseP是typedef
用于指向子句的指针。
*/
类型定义
双重的
权重_t;
//
权重及其和
统计_断言
(is_pod(重量_t),
"
Weight_t不是POD。
"
);
类型定义
std::vector<Weight_t>Weight_vector;
类型定义
Var Clause_index;
统计_断言
(标准::numeric_limits<Clause_index>::max(),
"
对于权重向量,类型Clause_index太大(这里的转换花费了太多时间)。
"
);
类型定义
标准::
uint_fast64_t
计数子句;
//
用于输入读取和初始化:
类型定义
std::vector<std:∶array<Count_clauses,
2
>>计数(_V);
计数子句;
//
“r”=“剩余”
班
条款
{
常数
点亮*b;
//
子句中的文字数组(与输入中一样)
常数
点亮*e;
//
过了终点
条款_索引长度_;
//
满足当前长度或0 iff子句
子句_索引旧_长度;
//
如果满意,满意前的长度
//
以下函数(用于初始化)设置这些数据成员
//
(同时不使用下面的私有成员函数):
朋友
空隙
添加_条款_公式
(
常数
Lit_vec&,Count_vec&);
//
下面的朋友(用于更新长度)只能访问以下内容
//
成员函数:
空隙
减量
()
无例外
{
断言
(长度_>=
2
); --
长度;}
空隙
增量
()
无例外
{
断言
(长度_>=
1
); ++
长度;}
空隙
停用
()
无例外
{
断言
(长度_>=
1
);
old_length=长度_;
长度_=
0
;
断言
(r_子句>=
1
);
--r_子句;
}
空隙
激活
()
无例外
{
断言
(长度_==
0
);
length_=旧长度;
++r_子句;
}
朋友
班
变更管理
;
朋友
空隙
赋值_0
(升)
无例外
;
朋友
空隙
分配_1
(升)
无异常
;
公众:
常数
点亮*
开始
()
常数
无例外
{
返回
b、 }
常数
升*
结束
()
常数
无例外
{
返回
e、 }
子句_索引
长度
()
常数
无例外
{
返回
长度;}
明确的
操作人员
布尔
()
常数
无例外
{
返回
长度;}
};
统计_断言
(is_pod(条款),“条款不是pod。”);
标准::ostream&
操作人员
<<(标准::ostream&out,
常数
条款&C){
对于
(
常数
点亮x:C)输出<<x<<
"
"
;
返回
退出<<
"
0
\n个
"
;
}
类型定义
第*条第P条;
类型定义
std::vector<子句>Clause_vec;
类型定义
std::vector<ClauseP>Clause_vec;
//
---文字出现的数据结构---
班
文字出现次数
{
班
文字_出现次数
{
常数
第P*b条;
//
带子句指针的数组
常数
第P*e条;
//
一个过去式发动机
朋友
班
文字出现次数
;
公众:
常数
条款E*
开始
()
常数
无例外
{
返回
b、 }
常数
条款E*
结束
()
常数
无例外
{
返回
e、 }
};
统计_断言
(is_pod(文字_出现),
"
Literal_occurrences不是POD。
"
);
类型定义
std::array<Literal_occurrences,
2
>变量_发生;
类型定义
标准::vector<变量发生率>vec_varocc;
类型定义
vec_varocc::大小类型大小类型;
vec_varocc varocc;
第五条所有事件;
空隙
初始化
(
常数
size_type s的大小,
常数
变量n,
常数
子句_vec&子句,计数_vec&Count){
如果
(个)==
0
)
返回
;
瓦罗克。
调整大小
(n)+
1
);
所有事件。
调整大小
(s) ;
常数
ClauseP*指针=&all_lit_occurrences[
0
];
对于
(变量v=
1
;
v<=n++
v)
对于
(
整数
第页=
0
;
第页<=
1
; ++
第页){
汽车
&L=varocc[v][p];
L。
b条
=指针;
指针+=计数[v][p];
L。
e(电子)
=指针;
}
断言
(指针=&all_lit_occurrences[
0
]+秒);
{
常数
汽车
clend=子句。
中央司令部
();
对于
(
汽车
i=条款。
卡宾
();
i!=
线索++
i){
对于
(
常数
点亮x:*i){
常数
变量v=
无功功率,无功功率
(x) ;
常数
极性p=
签名
(x) ;
*
常量(_C)
<克劳斯p*>(varocc[v][p]。
e(电子)
-计数[v][p]--)=
常量(_C)
<条款>(&*i);
}
}
}
}
文字出现次数
(
常数
文字事件和)=
删除
;
文字出现次数
(
常数
文字出现次数(&&)=
删除
;
朋友
空隙
读取公式
(
常数
标准::string&);
公众:
文字出现次数
() =
违约
;
常数
变量_发生&
操作人员
[](
常数
变量i)
常数
无例外
{
返回
varocc[i];}
};
//
---基本全局变量---
班
条款
{
条款_vec cl;
朋友
空隙
读取公式标题
(标准::istream&);
朋友
空隙
添加_条款_公式
(
常数
Lit_vec&,Count_vec&);
朋友
空隙
读取公式
(
常数
std::字符串&);
条款
(
常数
条款和)=
删除
;
条款
(条款&&)=
删除
;
公众:
条款
() =
违约
;
//
用于调试:
朋友
标准::ostream&
操作人员
<<(标准::ostream&out,
常数
条款&F){
对于
(
常数
条款&C:F。
氯
)输出<<C;
返回
退出;
}
}条款;
/*
施工后不再直接访问变量“子句”
(子句通过指向cl元素的指针进行处理);
“子句”是
类子句的唯一实例。
*/
文字发生率lits;
//
通过lits[v][pos/neg]获得文字出现的顺序
计数子句n_header_clauses,n_clausions,n_taut;
//
r_子句见上文
计数子句n_lit_occurrences;
变量n_vars,最大值_occ_Var;
子句_索引最大子句_长度;
类型定义
标准::
uint_fast64_t
计数统计;
计数统计_节点;
计数统计_回溯;
计数统计单位;
计数统计_评估;
#
如果未定义
第一个变量
计数统计n_proj,n_proj2zero,n_proj1zero,
n_nofirst,nwithfirst,nnosecond,nwithsecond;
权重_t sum_first、sum_second、sumsq_first和sumsq_seconds,
min_first=标准::numeric_limits<权重_t>::无限(),
min_second=min_first,
max_first=-std::numeric_limits<权重_t>::无限(),
max_second=max_first;
#
结尾
#
条件编译
变量边缘值(_M)
#
定义
所有解决方案
#
结尾
#
条件编译
所有解决方案
#
条件编译
纯文学
#
错误
“ALL_SOLUTIONS与PURE_LITERALS不兼容。”
#
结尾
#
结尾
#
如果
定义的PURE_LITERALS
计数统计n_pure_literals;
#
结尾
#
条件编译
TAU_地形
#
条件编译
阿尔法
#
错误
“ALPHA与TAU_ITERATION不兼容。”
#
结尾
#
结尾
#
条件编译
TAU_地形
计数统计wtau_call,tau_iterations;
#
结尾
#
条件编译
所有解决方案
#
如果未定义
计数_T
#
定义
计数_T
标准::
uint_fast64_t
#
结尾
类型定义
COUNT_T计数解决方案;
常量表达式
布尔
floating_count=标准::is_floating_point<计数解决方案>::value;
统计_断言
(浮点_计数
或
标准::is_unsigned<计数解决方案>::value,
"
如果使用整数类型进行计数,它必须是无符号的。
"
);
常量表达式
变量count_bits=std::numeric_limits<count_solutions>::数字;
常量表达式
整数
count_digits=标准::numeric_limits<计数解决方案>::digits10;
模板
<
类别名
计算机断层扫描,
布尔
IS_FLOATING_TYPE>
结构
电源2
;
模板
<
类别名
CT>
结构
功率2
<CT,
真的
> {
常量表达式
计算机断层扫描
操作人员
()(
常数
变量n)
无例外
{
返回
标准::pow
(
2
,n);}
};
模板
<
类别名
CT(计算机)>
结构
功率2
<CT,
假
> {
常量表达式
计算机断层扫描
操作人员
()(
常数
变量n)
无例外
{
返回
n<count_bits?
计算机断层扫描
(
1
)<<n:
0
;
}
};
Pow2<计数_解决方案,floating_Count>Pow2;
计数_解决方案_解决方案;
#
结尾
#
条件编译
变量_参数
类型定义
std::vector<Count_solutions>SolCount_vec;
#
结尾
//
---输入---
//
仅在read_formula_header和read_a_clause_from_file中使用:
类型定义
标准::
整数_传真64_t
轮次;
统计_断言
(标准::numeric_limits<Rounds>::digits<=标准::numeric_limits<Count_clauses>::数字,
"
Rounds类型与Count_clauses类型之间存在问题。
"
);
//
设置n_vars和n_header_clauses,并调用
//
子句.cl.resize(n_header_clauses);
在以下情况下通过std::exit中止
//
输入错误:
空隙
读取公式标题
(标准::istream&f){
std::字符串行;
断言
(f)。
好的
());
虽然
(
真的
) {
//
跳过注释
标准::getline
(f,行);
如果
(f)。
坏的
()) {
错误<<
"
系统故障导致读取错误。
"
;
std::退出
(文件读取错误);
}
如果
(f)。
电动势
()) {
如果
(
不
f、。
失败
()) {
常数
汽车
c=线路[
0
];
断言
(c!)=
'
\0
'
);
如果
(c!)=
'
第页
'
)
错误<<
"
试图读取注释时遇到文件结尾。
"
;
其他的
错误<<
"
尝试读取p-line时遇到文件结尾。
"
;
std::退出
(文件读取错误);
}
其他的
{
错误<<
"
文件末尾的空行(找不到p行)。
"
;
std::退出
(文件读取错误);
}
}
断言
(f)。
好的
());
常数
汽车
c=线路[
0
];
如果
(c)==
'
\0
'
) {
//
空行
错误<<
"
空行(找不到p-line)。
"
;
std::退出
(文件读取错误);
}
如果
(c)==
'
第页
'
)
打破
;
如果
(c!)=
'
c(c)
'
) {
错误<<
"
注释行必须以开头
\"
c(c)
\"
.
"
;
std::退出
(文件读取错误);
}
}
断言
(行[
0
] ==
'
第页
'
);
标准::字符串流
秒
(行);
{std::string inp;s>>inp;
如果
(输入=
"
第页
"
) {
错误的<<
"
参数行语法错误(
\"
第页
\"
后面没有空格)。
"
;
std::退出
(file_pline_error);
}
断言
(s) ;
如果
(第条)。
电动势
()) {
错误<<
"
参数行中的语法错误(p行结束于
\"
第页
\"
).
"
;
std::退出
(文件行错误);
}
s>>inp;
如果
(
不
秒
或
输入=
"
碳纤维
"
) {
错误的<<
"
参数行语法错误(否
\"
碳纤维
\"
).
"
;
std::退出
(文件行错误);
}
}
如果
(第条)。
电动势
()) {
错误<<
"
参数行中的语法错误(后面没有内容
\"
碳纤维
\"
).
"
;
std::退出
(文件行错误);
}
s>>n_vars;
如果
(
不
s){
错误<<
"
参数maximal-variable-index的读取错误
"
"
(太大或不是数字)。
"
;
std::退出
(文件行错误);
}
如果
(
不
有效的
(n_vars)){
错误<<
"
参数最大可变index n=
"
<<n_vars<<
"
对于numeric_limits来说太大<Lit_int>::max=
"
<<最大值<<
"
.
"
;
std::退出
(num_vars_error);
}
如果
(第条)。
电动势
()) {
错误<<
"
参数行中有语法错误(n-parameter后面没有任何内容)。
"
;
std::退出
(文件行错误);
}
s>>n_header_clauses;
如果
(
不
s){
错误<<
"
子句的参数数量读取错误
"
"
(太大或不是数字)。
"
;
std::退出
(文件行错误);
}
如果
(
不
秒。
电动势
()) {
错误<<
"
参数行中有语法错误(在c-parameter之后)。
"
;
std::退出
(文件行错误);
}
如果
(n_header_clause)>
计数条款(_C)
(标准::numeric_limits<Rounds>::
最大值
())) {
错误<<
"
对于循环计数器,参数number-of-clauses太大。
"
;
std::退出
(文件行错误);
}
尝试
{子句。
氯
.
调整大小
(n_header_clauses);}
抓住
(
常数
标准::bad_alloc&){
错误<<
"
大小子句向量的分配错误
"
<<
n_header_clauses(标题_条款)<<
"
(子句数)。
"
;
std::退出
(分配错误);
}
}
//
如果找不到(进一步的)子句,则返回false;
//
如果发现重言从句,则参考参数C为空:
内联
布尔
从文件读取文章
(标准::istream&f,Lit_vec&C){
{
静止的
标准::vector<Rounds>
文字_表格
(n_vars)+
1
,
0
);
静止的
轮次
圆
=
0
;
照明x;
断言
(f)。
好的
());
f>>x;
如果
(f)。
电动势
()) {
literal_table。
清楚的
();
literal_table。
收缩_调整
();
返回
假
;
}
C、。
清楚的
();
断言
(
圆
!=
标准::numeric_limits<轮次>::
最大值
());
++
圆
;
虽然
(
真的
) {
//
将文字读入C
如果
(
不
f){
错误<<
"
无效的文字读取。
"
;
std::退出
(文字_读取_错误);
}
断言
(f)。
好的
());
如果
(
不
x)
打破
;
//
条款末尾
常数
变量v=
无功功率,无功功率
(x) ;
如果
(v>n_vars){
错误<<
"
字面意义的
"
<<x<<
"
矛盾n=
"
<<n_vars<<
"
.
"
;
std::退出
(变量值错误);
}
常数
汽车
t=文字表[v];
常数
汽车
补偿=(
签名
(x) ==位置)?
圆
: -
圆
;
如果
(t==-comp){
//
同义反复
C、。
清楚的
();
做
如果
(
不
(f>>x)){
错误<<
"
重复逻辑子句中的文字读取无效。
"
;
std::退出
(文字_读取_错误);
}
虽然
(x) ;
返回
真的
;
}
其他的
如果
(t!=比较){
C、。
后推(_B)
(x) ;
literal_table[v]=comp;
}
f>>x;
}
}
如果
(C.)。
空的
()) {
错误<<
"
在输入中找到空子句。
"
;
std::退出
(空条款错误);
}
如果
(C.)。
大小
() ==
1
) {
错误<<
"
在输入中找到单位子句。
"
;
std::退出
(unit_clause_error);
}
返回
真的
;
}
//
仅当宣布的子句数太小(但可能太大)时出错:
内联
空隙
添加_条款_公式
(
常数
Lit_vec&D,Count_vec&Count){
常数
汽车
n=D。
大小
();
如果
(n)==
0
) {
//
这里的意思是同义反复
++n拉紧;
返回
;
}
如果
(n _条款>=n _标题_条款){
错误的<<
"
超过
"
<<n_header_clauses<<
"
子句,与cnf-header矛盾。
"
;
std::退出
(编号_条款_错误);
}
汽车
&C=条款。
氯
[条款];
C、。
长度_
=n;
C、。
b条
=
新的
亮[n];
C、。
e(电子)
=C。
b条
+n;
如果
(n>最大条款长度)最大条款长度=n;
对于
(条款_索引i=
0
;
i<n++
i){
常数
Lit x=D[i];
常量(_C)
<照明*>(C。
b条
)[i] =x;
常数
变量v=
无功功率,无功功率
(x) ;
++计数[v][
签名
(x) ];
最大cc变量=
标准::最大
(v,最大cc变量);
}
++n子句;
n_lit_occurrences+=n;
}
空隙
读取公式
(
常数
标准::字符串和文件名){
班
输入
{
常数
std::字符串-f;
标准::istream*
常数
p;
常数
布尔
del;
输入
(
常数
输入和)=
删除
;
输入
(输入&&)=
删除
;
公众:
输入
(
常数
标准::字符串&f):f(f),p(f)==
"
-立方英寸
"
? &
标准::cin:
新的
标准::ifstream(f)),del(f=
"
-立方英寸
"
) {
如果
(
不
*第页){
错误<<
"
无效的输入文件名:
"
<<f;
std::退出
(文件读取错误);
}
}
~输入
() {
如果
(删除)
删除
p、 }
标准::istream&
操作人员
*()
常数
{
返回
*p、 }
};
常数
输入
在里面
(文件名);
读取公式标题
(*英寸);
Count_vec计数;
尝试
{计数。
调整大小
(n_vars)+
1
); }
抓住
(
常数
标准::bad_alloc&){
错误<<
"
大小的计数矢量的分配错误
"
<<
n个变量<<
"
(最大可变指数)。
"
;
std::退出
(分配错误);
}
{照明C;
虽然
(
从文件读取文章
(*英寸,C))
添加_a_clause_to_formula
(C,计数);
}
如果
(
不
(r_条款=n_条款)
返回
;
尝试
{升。
初始化
(n_lit_occurrences,max_occ_var,子句。
氯
,计数);}
抓住
(
常数
标准::bad_alloc&){
错误<<
"
大小的ClauseP-vector的分配错误
"
<<
n_lit_发生次数<<
"
(文字出现的次数)。
"
;
std::退出
(分配错误);
}
}
//
---部分赋值和单位子句传播的数据结构---
/*
当前赋值:pass[v]是0 iff变量
v未赋值,否则在v->true和else-v的情况下为v。
*/
班
通过
{
Lit_vec传递;
空隙
初始化
(){通过。
调整大小
(最大cc变量+
1
); }
朋友
空隙
初始化
();
公众:
点燃
操作人员
[] (
常数
变量v)
常数
无例外
{
返回
传递[v];}
点亮&
操作人员
[] (
常数
变量v)
无例外
{
返回
传递[v];}
Lit_vec::size_type(_V)
大小
()
常数
无例外
{
返回
通过。
大小
(); }
变量
n个
()
常数
无例外
{
变量res=
0
;
断言
(通过[
0
]==0_l);
对于
(
汽车
x:通过)res+=
布尔
(x) ;
返回
物件;
}
朋友
标准::ostream&
操作人员
<<(标准::ostream&out,
常数
传递(&p){
退出<<
"
v(v)
"
;
对于
(变量i=
1
;
i<p。
大小
(); ++
i)
如果
(p[i])输出<<
"
"
;
返回
退出<<
"
0
"
<<标准::endl;
}
};
通行证;
#
条件编译
变量_参数
班
可变边距
{
解决方案计数(_vec)sc;
空隙
初始化
(){sc。
调整大小
(n_vars)+
1
); }
朋友
空隙
初始化
();
朋友
DLL_return_t(DLL_返回_ t)
dll0(dll0)
();
公众:
计数_解决方案
操作人员
[] (
常数
变量v)
常数
无例外
{
返回
sc[v];}
计数_解决方案&
操作人员
[] (
常数
变量v)
无例外
{
返回
sc[v];}
溶液计数vec::size_type
大小
()
常数
无例外
{
返回
南卡罗来纳州。
大小
(); }
朋友
标准::ostream&
操作人员
<<(标准::ostream&out,
常数
可变边距(&M){
对于
(变量i=
1
;
i<M。
大小
(); ++
i)
退出<<
"
"
<<i<<
"
:
"
<<M[i];
返回
输出<<std::endl;
}
};
VarMarginals边缘;
#
结尾
班
变更管理
{
条款(_vec)更改;
常数
第P条*开始;
第P条*下一条;
在原始视图中查看文件的其余部分
此时无法执行该操作。