Implémentation d'un programme de logique mathématique en C - C - Programmation
Marsh Posté le 10-02-2007 à 15:55:42
faut voir avec les cracks de la programmation fonctionnelle
nraynal ?
Marsh Posté le 10-02-2007 à 22:42:32
Plutôt que de donner tout de suite du code C, il pourrait être intéressant de nous expliquer déjà ton principe de lecture/analyse des clauses et comment tu penses les représenter en mémoire.
Il faudrait peut-être écrire une sorte de grammaire des clauses, formaliser les règles de déduction en termes de réécriture, fouille du côté de l'implémentation des Prolog.
Marsh Posté le 11-02-2007 à 02:34:45
Le langage C est une obligation pour toi dans ce cas?
Marsh Posté le 11-02-2007 à 10:22:43
le langage C n'est effectivement pas la panacée pour faire ce genre de choses, mais sinon si c'est obligatoire il va falloir déja voir à représenter tes expressions d'une manière traitable, par exemple en utilisant un truc du genre (je sens que ce bout de code va provoquer les fureurs de certains ) :
Code :
|
Tu fais quelques fonctions pour créer des struct expression pour commencer, histoire de pas te palucher des mallocs à travers tout ton code,
des trucs du genre :
Code :
|
Tu définis sur la struct expression_set (un expression_set c'est un ensemble d'expression, cad un sigma) les opérations habituelles de liste chainée (add, prev, next) et une fonction duplicate (tu va en avoir besoin pour crée tes plusieurs sigma quand ça "bifurque"...) et ensuite il te faudra aussi une liste chainée d'expression_set pour stocker tout tes sigma et les parcourir (enfin tu peut utiliser ce que tu veut comme conteneur, et si t'es flemmard ou que t'en a une de déja faite, tu utilise une liste chainée générique à base de void*... )
ensuite tu fais des fonction genre expression_set_is_consistant() pour faire tes test à la fin et une fonction expression_set_is_simple() pour savoir si une expression est "minimale" au sens de la forme A ou !A.
il te faut des fonctions de transformation d'arbre (les struct expression forment un arbre ...) qui utilisent tes 4 règles de transformation pour remplacer un expression_set par d'autres expression_set "simplifiés", çe sera le coeur de ton algo et pas forcément le plus facile... tant que expression_set_is_simple() renvoie vrai, tu ré-applique (en gros hein). quand toutes les expression_set sont simples, tu regarde si toutes tes expression_set sont consistantes avec la fonction idoine, selon le résultat tu as ta réponse, TADAM \o/
Bon le bonus c'est par contre qu'on début il te faudra peut-être transformer une expressions sous la forme humaine en chaîne de caractère en une structure d'arbre, fait ton flemmard, utilise le bulldozer, flex/bison (facile si tu maitrise les regexp cela dit)
Marsh Posté le 11-02-2007 à 11:03:24
L'interet d'ecrire ce genre de truc en C m'echappe...
Et effectivement, au vu du code que bad_day a donne, ca m'a l'air bien mal parti.
Marsh Posté le 11-02-2007 à 11:34:06
Tu connais COQ ?
sinon, en ML ca se fait genre 10x plus mieux vite
Marsh Posté le 11-02-2007 à 12:44:01
thermocline a écrit : Le langage C est une obligation pour toi dans ce cas? |
Non pas vraiment , mais c'est que c'est le langage que je maîtrise le mieux.
Citation : sinon, en ML ca se fait genre 10x plus mieux vite |
Oué, je croie que Caml (ou Ocaml) est plus adapter pour ce genre de programme. d'ailleurs y a un ami qui a essayer de m'aider en le faisant en oCaml: http://bluestorm.info/tmp/logic2.ml.html , mais ça ne marche pas tout a fait il a codé ça vite fait pour avoir une idée et il faudrait le modifier ptet un peu pour que ça donne le bon résultat... et ce n'ai pas envidant pour moi de bien comprendre ce qu'il a fait ( puisque je ne maîtrise que le C )
Alors si tu tu fait du caml Joel F, tu pourrai m'aider a continuer ce code ?
Sinon j'ai fait un peut de code mal parti Juste pour tester.., pour la création d'ensemble etc..:
Code :
|
ça sera sympa si vous pourriez m'aider.
Marsh Posté le 11-02-2007 à 21:11:36
Si tu n'est pas obligé d'utiliser le C, alors j'ai vu un prouveur en Prolog qui fait ça en 40 lignes de code.
Marsh Posté le 11-02-2007 à 21:22:53
Je ne peux que te conseiller de regarder du côté de Prolog, en tant que programmeur, ça ouvre l'esprit.
Marsh Posté le 12-02-2007 à 15:35:17
Trap D a écrit : Je ne peux que te conseiller de regarder du côté de Prolog, en tant que programmeur, ça ouvre l'esprit. |
Mais je ne connais pas ce langage , et je croi pas que j'aurais le temps d'aprendre un langage juste pour realiser cet exercice.
Donc je croie que je préférerai le faire en C.
P.S. J'ai un peut édité le code du dernier topic...
Marsh Posté le 15-02-2007 à 20:24:13
Si tu es tjrs sur cet exercice, tu fais comme tu veux, mais on ne pourra pas t'aider, l'algo est trop complexe pour être codé en C simplement, ça prendrait plus de temps que la plupart d'entre nous sont prêts à y consacrer. Tu ferais mieux d'apprendre ocaml et de reprendre le code de ton copain (qui a l'air de bien torcher, au passage) et de te faire aider par lui.
Marsh Posté le 15-02-2007 à 22:09:10
el muchacho a écrit : Si tu es tjrs sur cet exercice, tu fais comme tu veux, mais on ne pourra pas t'aider, l'algo est trop complexe pour être codé en C simplement, ça prendrait plus de temps que la plupart d'entre nous sont prêts à y consacrer. Tu ferais mieux d'apprendre ocaml et de reprendre le code de ton copain (qui a l'air de bien torcher, au passage) et de te faire aider par lui. |
Euh, j'ai dja donné une bonne partie quand même...
Marsh Posté le 22-02-2007 à 11:29:38
Reply
Marsh Posté le 07-02-2007 à 15:34:43
Hello all.
Je suis entrain d'essayer de faire un programme pour faire un truc de logique
mathématique en utilisant l'Algorithme de réfutation pour trouver si une déduction est
vraie ou fausse. J'ai compris l'algorithme mais pour l'implémentation en langage C je
galère a mort.
les connecteur logique utiliser sont: et (& ), ou (|), non (i), -> (l'implication).
**** J'explique L'algorithme:
Cet algorithme suit les étapes suivantes:
(1)
J'ai une déduction, en cas générale c'est
P1, P2, P3, ..., Pn DEDUIT P
par exemple, si j'ai P1 P2 et P3 comme ceci:
P1: B -> !A
P2: !B -> (C et A)
P3: !A ou !C
P: !A
Note: sachant que l'expression (I -> J) veut dite !(I et !J)
alors ma déduction est :
(B -> !A), !B -> (C et A), !A ou !C DEDUIT !A
(L%u2019algorithme de réfutation va vérifier si cette déduction est vraie ou pas)
(2)
On transforme notre déduction en un ensemble sigma comme suite:
sigma = { P1, P2, P3, !P } (par exemple)
en cas générale c'est: sigma = { P1, P2, P3, ....., !P }
(3)
On applique un ensemble de règles sur l'ensemble sigma,
ces règles sont appeler des Closes, et sont les suivant:
1- si j'ai dans une certaine formule Pi l'expression {!!A}, alors ça deviens {A}
2- si j'ai {A & B} j'obtiens {A, B}
3- si j'ai {!(A et B)} j'obtiens deux chose: {!A} et également {!B}
4- si j'ai {A -> B} j'obtiens {!A} {B}
Exemple:
Si j'ai un ensemble comme ça:
sigma = { !!A, C&A, (B -> !A), !(A&B) } on appliquant les close une par une ça devien:
( on appliquant la 1ere close: )
sigma = { A, C&A, (B -> !A), !(A&B) }
( on appliquant la 2ere close: )
sigma = { A, C, A, (B -> !A), !(A&B) }
( on appliquant la 4ere close: ) on aura 2 ensemble:
sigma1 = { A, C, A, !B, !(A&B) }
sigma2 = { A, C, A, !A, !(A&B) }
( on a appliquant la 3ere close sur sigma1 : ) on auras 2 autre ensemble:
sigma3 = { A, C, A, !B, !A }
sigma4 = { A, C, A, !B, !B }
( on a appliquant la 3ere close sur sigma2 : ) on auras 2 autre ensemble:
sigma5 = { A, C, A, !A, !A }
sigma6 = { A, C, A, !A, !B }
On ne pas allez plus loin (simplifier) dans ces ensembles donc on s'arrête ici, et on appelle
ces ensemble des ensemble littéraux.
Remarquant qu'a partir de sigma j'ai eu 4 ensemble littéraux: sigma3, sigma4, sigma5,
sigma6
Voici un schémas:
sigma
/\
/ \
/ \
sigma1 sigma2
/\ /\
/ \ / \
/ \ / \
sigma3 sigma4 sigma5 sigma6
Les ensembles sigma3 sigma4 sigma5 sigma6 sont appelés des ensembles de littéraux,
-Si tout les ensemble de littéraux sont inconsistant (cf plus bas) alors ma déduction du
début est VRAIE
-Si tout les ensemble de littéraux sont satisfiable, alors ma déduction du début est
FAUSSE.
En dit qu'un ensemble est inconsistant SI cet ensemble contiens des élément qui ce
contredit, par exemple dans notre exemple précédant: l'ensemble sigma5 contiens
l'élément A et l'élément !A alors il est inconsistant, sigma6 et sigma3 aussi.
SINON il est satisfiable, par exemple comme sigma4.
off...
**** Implémentation en C:
Ah là je galère, je ne sais pas comment implémenter les tout ces ensemble dans un
exemple concret de programme !
J'ai donc utilisé des tableaux de chaîne de caractère tout simplement, mais formules sont
en fait des chaînes de caractère.
Bon je met ce que j'ai déjà réussi a faire, mais ce n'ai rien:
I know that the topic is too long but thank you for your help.
Message édité par bad___day le 22-02-2007 à 11:30:21