Skip to content
Snippets Groups Projects
Commit 225b83fa authored by Robin VAN DE MERGHEL's avatar Robin VAN DE MERGHEL :computer:
Browse files

Course of Modelisation

parent 50d804a8
No related branches found
No related tags found
No related merge requests found
......@@ -47,13 +47,18 @@ def get_formula_from_file(file):
Formula is on one line in the file.
Example of formula: a,-b,cloclo&b,-a,-c&d,-a,-b&-cloclo,-name,-a,-b
"""
formula = []
with open(file, "r") as fileIn:
line = fileIn.readline().strip()
clauses = line.split(",")
clauses = line.split("&")
for clause in clauses:
yield clause.split("&")
literals = clause.split(",")
formula.append(literals)
return formula
# for clause in get_formula_from_file("formula.txt"):
# print(clause)
......@@ -75,8 +80,8 @@ def set_of_variables_from_formula(f):
fSet = set()
for clauses in f:
for clause in clauses:
fSet.add(variable_of_literal(clause))
for litteral in clauses:
fSet.add(variable_of_literal(litteral))
return fSet
# print(set_of_variables_from_formula(get_formula_from_file("formula.txt")))
......@@ -110,28 +115,41 @@ def boolean_value_of_literal(assignment, literal):
def boolean_value_of_clause(assignment, clause):
"""Given an assignment and a clause, returns the Boolean value of the
clause."""
return any([boolean_value_of_literal(assignment[variable_of_literal(literal)], literal) for literal in clause])
# assignment = random_assignment(construct_dictionary_from_vars({"a", "b", "c"}))
# assignment = {"a": False, "b": False, "c": True}
# print(assignment)
# print(boolean_value_of_literal(assignment["a"], "a"))
# print(boolean_value_of_clause(assignment, ["a", "b", "c"]))
# print(boolean_value_of_clause(True, ["a", "-b", "c"]))
def boolean_value_of_formula(assignment, formula):
"""Given an assignment and a formula, returns the Boolean value of the
formula."""
pass
return all([boolean_value_of_clause(assignment, clause) for clause in formula])
def number_of_true_clauses(assignment, formula):
"""Given an assignment and a formula, returns the number of clauses having
a Boolean value True."""
pass
return sum([boolean_value_of_clause(assignment, clause) for clause in formula])
def number_of_clauses(formula):
"""Returns the number of clauses of the formula."""
pass
return len(formula)
def pretty_print_formula(formula):
"""Print a nice/readable view of the formula."""
pass
for clause in formula:
print(" or ".join(clause))
# formula = get_formula_from_file("formula.txt")
# pretty_print_formula(formula)
def pretty_print_assigned_formula(assignment, formula):
......@@ -140,7 +158,24 @@ def pretty_print_assigned_formula(assignment, formula):
True not(False) True = True
not(True) False not(True) = False
True False True = True"""
pass
for clause in formula:
for literal in clause:
literalName = variable_of_literal(literal)
if sign_of_literal(literal) == "+":
print(assignment[literalName], end="\t")
else:
print(not assignment[literalName], end="\t")
print(" = ", end="\t")
print(boolean_value_of_clause(assignment, clause))
# formula = get_formula_from_file("formula.txt")
# assignment = random_assignment(construct_dictionary_from_vars(
# set_of_variables_from_formula(formula)))
# pretty_print_assigned_formula(assignment, formula)
def random_formula(n=26, c=10, min_len=1, max_len=10, file="FX"):
......@@ -148,20 +183,82 @@ def random_formula(n=26, c=10, min_len=1, max_len=10, file="FX"):
each with at least min_len literals and at most max_len literals.
Put the final formula in file.
Each variable must be a non capital letter (a, b, c,...,z). """
pass
# First we create a list of vars (random 3 long strings)
vars = []
for _ in range(n):
newVar = ""
while newVar in vars or len(newVar) != 3:
newVar = ""
for j in range(3):
newVar += chr(random.randint(97, 122))
vars.append(newVar)
formula = []
for _ in range(c):
# We get a number between min_len and max_lend
n = random.randint(min_len, max_len)
formulaVars = random.sample(vars, n)
signedVars = [random.choice(["", "-"]) + var for var in formulaVars]
formula.append(signedVars)
with open("formula2.txt", "w") as file:
for i in range(len(formula)):
clause = formula[i]
file.write(",".join(clause))
if i < len(formula) - 1:
file.write("&")
# random_formula()
def iter_all_assignments(d):
"""An iterator to generate all the possible assignments of a dictionary d.
NB: the call returns an iterator of assignments, not the assignments."""
pass
keys = list(d.keys())
n = len(keys)
def binIter():
for i in range(2**n):
l = []
for j in range(n):
l.append((i >> j) % 2)
yield l
for it in binIter():
yield {keys[i]: bool(it[i]) for i in range(n)}
# for assign in iter_all_assignments({"a": None, "b": None, "c": None}):
# print(assign)
def evaluate_all_assignments(formula):
"""Returns, for each possible assignment of the variables of the formula,
the list of the number of satisfied clauses (with Boolean value True)."""
pass
evaluations = []
for assignment in iter_all_assignments(construct_dictionary_from_vars(
set_of_variables_from_formula(formula))):
evaluations.append(number_of_true_clauses(assignment, formula))
return evaluations
print(evaluate_all_assignments(get_formula_from_file("formula.txt")))
"""
Example of pretty print of formula a,-b,c&-a,b,-d&a,b,c&-b,d,-e&a,-c,e :
......
"""Programmation d'un système de re-écriture de chaines de caractères.
Dans cette activité on travaille avec des chaines de caractères ne
pouvant contenir QUE les caractères "X", "0" et "1".
En entrée on se donne une chaine composée uniquement de "X" (rien d'autre).
Cette chaine doit être re-écrite, tant que cela est possible, à l'aide des
règles ci-dessous.
Attention :
+ la règle 3 ne doit être utilisée QUE si les deux premières ne peuvent
pas/plus être utilisées.
+ Dans la description des règles ci-dessous, w et w' désignent des chaines
quelconques, de longueurs quelconques, y compris nulles.
Règle 1 : Xw -> 0Xw
Règle 2 : w0XXw' -> wX0w'
Règle 3 : w0Xw' -> w1w'
- XXX
- 0XXX
- X0X
- 0X0X
- 10X
- 11
À faire :
+ Essayez quelques cas à la main. Par exemple, re-écrivez "XXX".
+ Programmez ce procédé de re-écriture.
+ À quoi sert-il ? Prouvez-le...
+ Programmez le système inverse.
NB : vous ne devez pas utiliser de bibliothèque.
"""
def regle_1(chaine):
"""Application de la règle 1"""
if chaine.startswith("X"):
return True, "0" + chaine
return False, None
def regle_2(chaine):
"""Application de la règle 2. """
index = chaine.find("0XX")
if index != -1:
return True, chaine[:index] + "X0" + chaine[index+3:]
return False, None
def regle_3(chaine):
"""Application de la règle 3."""
index = chaine.find("0X")
if index != -1:
return True, chaine[:index] + "1" + chaine[index+2:]
return False, None
def traduit(chaine):
"""Appliquer les règles de re-écriture 1, 2 et 3 tant que c'est possible.
Attention : n'appliquer la règle 3 que si les deux premières ne sont plus
applicables."""
worked = True
while worked:
print(chaine)
worked, chaine2 = regle_1(chaine)
if worked:
chaine = chaine2
continue
worked, chaine2 = regle_2(chaine)
if worked:
chaine = chaine2
continue
worked, chaine2 = regle_3(chaine)
if worked:
chaine = chaine2
traduit("X"*12)
a,-b,cloclo&b,-a,-c&d,-a,-b&-cloclo,-name,-a,-b
\ No newline at end of file
a,-b,c&-a,b,-d&a,b,c&-b,d,-e&a,-c,e
\ No newline at end of file
-cvh,srs,-mut,qnz&aqp,eui,wxy,-acs,-ogd,srs,-dui,-trl,pfi&-srs,evk&-acs,-pfi,-dui,-evk,-ixi,-vpg,srs,-cwa&pfi,djn,exx,mut&-cwa,-dui,cvh,trl,atq,djn,srs&-cgb&-exx,-srs,-zrh&jqw,zoh,ixi,-srs&-zrh,jqw,-acs,-mut,qnz,aqp,-eui,zrr,cwa
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment