-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsat.py
More file actions
executable file
·74 lines (65 loc) · 1.71 KB
/
sat.py
File metadata and controls
executable file
·74 lines (65 loc) · 1.71 KB
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
import itertools
#--Entrada
entrada = input()
inputs = entrada.split(" ")
variaveis = int(inputs[2])
clausulas = int(inputs[3])
#---Pedindo as variáveis com base nas clausulas e formando o dicionário
cls=[[] for i in range(clausulas)]
for i in range(clausulas):
x=input()
cls[i]=x.split()
resultado = {'cls':cls}
c=resultado['cls']
#--retorna subseqüências de comprimento de elementos da entrada por conta das conbinações
list1=[]
list2=[]
for num in c:
for n in num:
ni=int(n)
list1.append(ni)
list2.append(list1)
list1 = []
varlist=[]
for t in range(variaveis):
t=t+1
varlist.append(t)
#---Usando a biblioteca pois se a entrada iterável for classificada, as tuplas de combinação serão produzidas na ordem classificada
perm=set(itertools.combinations_with_replacement([1, 0, 1], variaveis))
permlist=[]
for i in perm:
permlist.append(i)
fim=0
#--Recebe a permutação lendo o conteúdo da lista e verifica se a soma é maior que 0(que no caso nao seria satisfativel) e se for = 0 seria satisfatível e atribue se é True ou False.
for per in permlist:
contador=0
input=0
list3=[]
for j in list2:
a=[]
const=0
for i in j:
if i<0:
if per[const]==1:
a.append(int(0))
else:
a.append(int(1))
elif i>0:
a.append(int(per[const]))
else:
break
const+=1
list3.append(a)
#--A list3 vai ser lida e para cada caso satisfatível vai ser adicionado 1 no contador.
for i in list3:
for i in i:
if i==1:
contador+=1
break
#--Adiciono 1 para cada permutação
if contador == clausulas:
fim+=1
if fim>0:
print("Satisfiable")
else:
print("Unsatisfiable")