/
main-egalite.cpp
95 lines (77 loc) · 3.19 KB
/
main-egalite.cpp
1
2
3
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
#include<iostream>
#include"include/TransformationTseitin.h"
#include"include/LanceurSolveur.h"
#include"include/FormuleTseitin.h"
#include"parser/egalite/driver.h"
#include"include/InsatisfiableException.h"
#include"include/TheorieGreffonEgalite.h"
#include<chrono>
using namespace std;
using namespace std::chrono;
FormuleTseitin<AtomeEgalite> parseFormuleFile(string fileName);
FormuleTseitin<AtomeEgalite> parseFormuleFile(string fileName)
{
EgaliteParser::Driver parserDriver;
try
{
return parserDriver.parse(fileName);
}
catch(ParseError& e)
{
cerr << "c Erreur du parser : " << e.getMessage() << "\nc Arrêt de la résolution." << endl;
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
vector<string> nomArguments(1);
nomArguments[0]="inputFile";
ArgumentsParser arguments(nomArguments, LanceurSolveur::getNomsOptions(), 1);
arguments.parse(argc, argv);
if(arguments.demandeAide())
{
cout<<endl<<"Syntaxe :"<<endl;
cout<<"./egalite_solver nom_de_fichier.txt"<<endl;
cout<<endl<<"Solveurs : "<<endl;
cout<<"-dpll DPLL (défaut)"<<endl;
cout<<"-wl Watched Literals"<<endl<<endl;
cout<<"Clause Learning (seulement avec -dpll et -wl) :"<<endl;
cout<<"-cl Clause Learning simple"<<endl;
cout<<"-cl-interac Clause Learning interactif"<<endl<<endl;
cout<<"Divers :"<<endl;
cout<<"-v Verbose"<<endl;
cout<<"-s Silencieux"<<endl;
cout<<"-h Vous y êtes"<<endl;
cout<<"--help Vous y êtes"<<endl<<endl;
return(EXIT_SUCCESS);
}
LanceurSolveur lanceur(arguments, "c", SolveurType::DPLL, HeuristiqueType::MOMS);
ostream out(lanceur.getBufferSortie());
FormuleTseitin<AtomeEgalite>* formuleTseitin = new FormuleTseitin<AtomeEgalite>(parseFormuleFile(arguments.getArgument("inputFile")));
TransformationTseitin<AtomeEgalite> normalisateur(formuleTseitin);
auto beginTime = system_clock::now();
Formule formule(normalisateur.normaliser());
formuleTseitin->free();
delete formuleTseitin;
try
{
TheorieGreffonEgalite theorieGreffon;
vector<AtomeEgalite> correspondance(normalisateur.getCorrespondance().size());
for(pair<AtomeEgalite, int> t : normalisateur.getCorrespondance())
correspondance[static_cast<size_t>(t.second - 1)]=t.first;
theorieGreffon.setCorrespondanceAtomes(correspondance);
formule = lanceur.execute(formule, theorieGreffon);
out << "s SATISFIABLE" << endl;
pair<vector<AtomeEgalite>,vector<AtomeEgalite>> etat = theorieGreffon.getEtatCourant();
for(AtomeEgalite atome : etat.first)
out << "x" << atome.getI() << " = x" << atome.getJ() << endl;
for(AtomeEgalite atome : etat.second)
out << "x" << atome.getI() << " != x" << atome.getJ() << endl;
}
catch(InsatisfiableException)
{
out << "s UNSATISFIABLE" << endl;
}
out << "c Resolu en : " << duration_cast<duration<double>>(system_clock::now() - beginTime).count() << " secondes" << endl;
return EXIT_SUCCESS;
}