Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Un système expert en Panoramic Jeu 26 Jan 2012 - 2:04 | |
| Pour m'amuser, j'ai écrit un petit programme ressemblant u, peu à un système expert. Je l'ai surtout fait pour tester une nouvelle technique de programmation permettant de simuler des fenêtres de message et de saisie s'ouvrant en mode modal, c'est-à-dire rendant impossible de continuer dans l'application tant que la fenêtre de message ou de saisie n'est pas validée. Cela est réussi. La fenêtre de saisie peut contenir des champs de saisie et des boutons, on traite les données selon les boutons cliqués. La fenêtre de messages contient un memo dans lequel on dépose le texte voulu, selon la situation, et on peut le défiler avec la souris pour le voir en entier. Là encore, le programme "s'arrête" pour ne continuer qu'après la fermeture de la fenêtre de messages par la croix rouge. De plus, j'ai testé une nouvelle façon de regrouper le code, en pousant un peu plus la modularité. Voici le programme principal: - Code:
-
label labels : gosub labels gosub variables gosub GUI
gosub charger_base
end Court, non ? Je définis juste un label pour pouvoir faire GOSUB labels. Et dans ce sous-programme, je définie tous les labels du programme. Ensuite, j'appelle le sous-programme variables (dont le label a été défini dans le sous-programme labels) pour définir absolument toutes les variables du programme. Puis, j'appelle GUI qui définit l'interface graphque (GUI=Graphical User Interface), donc tous les objets Panoramic avec leurs attributs. Et finalement, j'appelle charger_base qui charge un fichier contenant des données initiales, en occurence ma base de connaissance. Maintenant pour les fonctionnalités. Le programme est conçu pour réagir à des pseudo-phrases en français, selon un modèle de phrases préformatées pour chaque fonction. Le programme connait 2 types d'ntités: des "nom" et des "verbes". Et avec ces éléments, on peut faire des "affirmations" du type <sujet> <verbe> <objet> est <vrai/faux> Cela donne par exemple: <les chats mangent du fromage> est faux. Dans cet exemple, "les chats" et "du fromage" sont considérés comme des "nom", et "mangent" comme un "verbe". Bien sûr, le programme ne connaît rien à la syntaxe, à la conjugaison, etc. Il faut donc donner tous ces éléments dans leur forme exacte si l'on veut obtenir un résultat significatif. Pour cela, il y a 4 grandes fonctions: "Definitions" permet de "définir" un nom ou un verbe. "Affirmations" permet de mémoriser une phrase telle que celle ci-dessus, à conditions que les éléments soient connues déjà. "Questions" permet de savoir si une affirmation supposée est connue ou non, ou si elle est vraie ou non. "Interrogations" permet de voir la totalité des connaissances du programme, ou savoir ce que le programme sait ou ne sait pas sur un mot, un nom ou un verbe. Tous les messages sont dans un français textuel. Une petite base de connaissance est ici: - Citation :
- == SYSTEME_EXPERT BASE DE CONNAISSANCES
== Noms les chats les souris du fromage == Verbes mangent craignent == Affirmations les chats|mangent|les souris#vrai les souris|mangent|les chats#faux les souris|craignent|les chats#vrai les chats|mangent|du fromage#faux les souris|mangent|du fromage#vrai == EOF ==
et le code du programme est ici: - Code:
-
' SYSTEME_EXPERT.BAS ' ' Simulation d'intelligence artificielle
' Ce programme réagit à des phrases en Français ' simplifié, selon une syntaxe rigide pré-définie.
' Ce langage contient différents types de phrases ' Définitions: ' Une définition est une phrase du type: ' [Je déclare que] <mot> [est un] [verbe|nom|adjectif] [!] ' Affirmations: ' Une affirmation est une phrase du type ' <sujet> <verbe> <objet> [.] ' Si sujet, verbe ou objet sont inconnus, ' le programme le signale et arrête. ' L'affirmation est alors vérifiée. Il y a 3 possibilités: ' 1. elle est connue et vraie, le programme répond vrai. ' 2. elle est connue et fausse, le programme répond faux ' 3 elle est inconnue - le programme demande alors ' s'il faut l'accepter. Si oui, elle est intégrée ' dans la base de connaissances. ' Questions: ' Une question est une phrase du type: ' [Est-ce que] <sujet> <verbe> <objet> [?] ' la question est alors vérifiée comme une affirmation. ' si elle est connue et vraie, le programme répond vrai ' si elle est connue et fausse, le programme répond faux ' si elle est inconnue, le programme répond inconnu
' La base de connaissance est une liste de déclarations et d'affirmations. ' format: ' entête ' déclarations ' noms ' verbes ' affirmations ' fin de fichier
label labels : gosub labels gosub variables gosub GUI
gosub charger_base
end
labels: label variables, GUI, charger_base, close0 label b_declaration, b_affirmation, b_question, b_interrogation label b_abandonner_declaration, b_valider_declaration label b_abandonner_affirmation, b_valider_affirmation label b_abandonner_question, b_valider_question label b_abandonner_interrogation, b_valider_interrogation label option_interrogation, close11, chercher_nom, chercher_verbe label decoder_affirmation
return
close0: file_open_write can_base%,path_base$+base_fichier$ ' entête file_writeln can_base%, base_entete$ ' noms file_writeln can_base%, "== Noms" if count(x_noms%)>0 for i%=1 to count(x_noms%) file_writeln can_base%, item_read$(x_noms%,i%) next i% end_if ' verbes file_writeln can_base%, "== Verbes" if count(x_verbes%)>0 for i%=1 to count(x_verbes%) file_writeln can_base%, item_read$(x_verbes%,i%) next i% end_if ' affirmations file_writeln can_base%, "== Affirmations" if count(x_affirmations%)>0 for i%=1 to count(x_affirmations%) file_writeln can_base%, item_read$(x_affirmations%,i%) next i% end_if ' fin de fichier file_writeln can_base%, "== EOF ==" file_close can_base% return
variables: ' constantes dim id$ : id$ = "Système Expert V1.00" dim path_base$ : path_base$ = "C:\Langages\Expert\" dim base_entete$ : base_entete$ = "== SYSTEME_EXPERT BASE DE CONNAISSANCES" dim base_fichier$ : base_fichier$ = "systeme_expert_base.txt" dim crlf$ : crlf$ = chr$(13) + chr$(10) dim can_base% : can_base% = 1 dim x_declarations% : x_declarations% = 51 dim x_noms% : x_noms% = 52 dim x_verbes% : x_verbes% = 53 dim x_affirmations% : x_affirmations% = 54 ' variables dim s$, s1$, s2$, s3$, i%, j%, res%, onglet%, bool$, bool1$, flag% return
GUI: on_close 0,close0 dlist x_declarations% : dlist x_noms% : dlist x_verbes% : dlist x_affirmations%
caption 0,"Je suis le "+id$ : width 0,650 : height 0,600 button 1 : top 1,10 : left 1,10 : caption 1,"Déclaration" on_click 1,b_declaration button 2 : top 2,10 : left 2,110 : caption 2,"Affirmation" on_click 2,b_affirmation button 3 : top 3,10 : left 3,210 : caption 3,"Question" on_click 3,b_question button 4 : top 4,10 : left 4,310 : caption 4,"Interrogation" on_click 4,b_interrogation form 11 : hide 11 : on_close 11,close11 : left 11,100 top 11,100 : width 11,400 : border_small 11 memo 12 : parent 12,11 : top 12,10 : left 12,10 height 12,height(11)-50 : width 12,width(11) - 50
' <déclaration> == [Je déclare que] <mot> [est un] [verbe|nom] [!] container 101 : hide 101 : caption 101,"Déclaration" top 101,40 : left 101,10 : width 101,600 : height 101,400 font_size 101,12 alpha 102 : parent 102,101 : top 102,30 : left 102,10 font_size 102,12 : font_bold 102 caption 102,"Je déclare que" edit 103 : parent 103,101 : top 103,60 : left 103,40 : width 103,200 alpha 104 : parent 104,101 : top 104,90 : left 104,70 font_size 104,12 : font_bold 104 caption 104,"est un" container_option 105 : parent 105,101 : top 105,120 : left 105,100 width 105,150 : height 105,80 option 106 : parent 106,105 : top 106,20 : left 106,10 : caption 106,"verbe" option 107 : parent 107,105 : top 107,50 : left 107,10 : caption 107,"nom" button 198 : parent 198,101 : top 198,230 : left 198,10 : width 198,100 caption 198,"Abandonner" : on_click 198,b_abandonner_declaration button 199 : parent 199,101 : top 199,230 : left 199,130 : width 199,100 caption 199,"Valider" : on_click 199,b_valider_declaration mark_on 106 ' <affirmation> == <sujet> <verbe> <objet> [.] container 201 : hide 201 : caption 201,"Affirmation" top 201,40 : left 201,10 : width 201,600 : height 201,400 font_size 201,12 alpha 202 : parent 202,201 : top 202,40 : left 202,10 caption 202,"J'affirme que" alpha 203 : parent 203,201 : top 203,70 : left 203,40 caption 203,"(sujet)" edit 204 : parent 204,201 : top 204,70 : left 204,140 alpha 205 : parent 205,201 : top 205,100 : left 205,70 caption 205,"(verbe)" edit 206 : parent 206,201 : top 206,100 : left 206,170 alpha 207 : parent 207,201 : top 207,130 : left 207,100 caption 207,"(objet)" edit 208 : parent 208,201 : top 208,130 : left 208,200 alpha 209 : parent 209,201 : top 209,160 : left 209,130 caption 209,"(est Vrai/Faux)" combo 210 : parent 210,201 : top 210,160 : left 210,250 item_add 210,"vrai" : item_add 210,"faux" : text 210,"vrai" button 298 : parent 298,201 : top 298,230 : left 298,10 : width 298,100 caption 298,"Abandonner" : on_click 298,b_abandonner_affirmation button 299 : parent 299,201 : top 299,230 : left 299,130 : width 299,100 caption 299,"Valider" : on_click 299,b_valider_affirmation ' <question> == [Est-ce que] <sujet> <verbe> <objet> [?] container 301 : hide 301 : caption 301,"Question" top 301,40 : left 301,10 : width 301,600 : height 301,400 font_size 301,12 alpha 302 : parent 302,301 : top 302,40 : left 302,10 caption 302,"Est-ce que" alpha 303 : parent 303,301 : top 303,70 : left 303,40 caption 303,"(sujet)" edit 304 : parent 304,301 : top 304,70 : left 304,140 alpha 305 : parent 305,301 : top 305,100 : left 305,70 caption 305,"(verbe)" edit 306 : parent 306,301 : top 306,100 : left 306,170 alpha 307 : parent 307,301 : top 307,130 : left 307,100 caption 307,"(objet)" edit 308 : parent 308,301 : top 308,130 : left 308,200 alpha 309 : parent 309,301 : top 309,160 : left 309,130 caption 309,"(est Vrai/Faux)" combo 310 : parent 310,301 : top 310,160 : left 310,250 item_add 310,"vrai" : item_add 310,"faux" : text 310,"vrai" button 398 : parent 398,301 : top 398,230 : left 398,10 : width 398,100 caption 398,"Abandonner" : on_click 398,b_abandonner_question button 399 : parent 399,301 : top 399,230 : left 399,130 : width 399,100 caption 399,"Valider" : on_click 399,b_valider_question ' <interrogation> == [QUE CONNAIS-TU ?] | [QUE SAIS-TU SUR] <nom> [?] container 401 : hide 401 : caption 401,"Interrogation" top 401,40 : left 401,10 : width 401,600 : height 401,400 font_size 401,12 container_option 402 : parent 402,401 : top 402,20 : left 402,10 caption 402,"Type d'interrogation" : width 402,280 option 403 : parent 403,402 : top 403,40 : left 403,10 : width 403,250 caption 403,"[QUE CONNAIS-TU ?]" : on_click 403,option_interrogation option 404 : parent 404,402 : top 404,70 : left 404,10 : width 404,250 caption 404,"[QUE SAIS-TU SUR]" : on_click 404,option_interrogation edit 405 : parent 405,401 : top 405,90 : left 405,300 alpha 406 : parent 406,401 : top 406,90 : left 406,430 : caption 406,"[?]" button 498 : parent 498,401 : top 498,230 : left 498,10 : width 498,100 caption 498,"Abandonner" : on_click 498,b_abandonner_interrogation button 499 : parent 499,401 : top 499,230 : left 499,130 : width 499,100 caption 499,"Valider" : on_click 499,b_valider_interrogation inactive 405 : mark_on 403 return option_interrogation: if checked(403)=1 inactive 405 else active 405 end_if return
close11: hide 11 hide onglet% active 1 : active 2 : active 3 : active 4 return
charger_base: clear x_declarations% if file_exists(path_base$+base_fichier$)=1 file_open_read can_base%,path_base$+base_fichier$ ' entête file_readln can_base%,s$ if s$<>base_entete$ message "La base de connaissance est corrompue !" file_close can_base% return end_if file_readln can_base%,s$ if s$<>"== Noms" message "La base de connaissance est corrompue !" file_close can_base% return end_if repeat file_readln can_base%,s$ if left$(s$,3)<>"== " then item_add x_noms%,s$ until left$(s$,3)="== " if s$<>"== Verbes" message "La base de connaissance est corrompue !" file_close can_base% return end_if repeat file_readln can_base%,s$ if left$(s$,3)<>"== " then item_add x_verbes%,s$ until left$(s$,3)="== " if s$<>"== Affirmations" message "La base de connaissance est corrompue !" file_close can_base% return end_if repeat file_readln can_base%,s$ if left$(s$,3)<>"== " then item_add x_affirmations%,s$ until left$(s$,3)="== " file_close can_base% else file_open_write can_base%,path_base$+base_fichier$ ' entête file_writeln can_base%, base_entete$ ' noms file_writeln can_base%, "== Noms" ' verbes file_writeln can_base%, "== Verbes" ' affirmations file_writeln can_base%, "== Affirmations" ' fin de fichier file_writeln can_base%, "== EOF ==" file_close can_base% end_if return b_abandonner_declaration: hide 101 active 1 : active 2 : active 3 : active 4 return b_valider_declaration: onglet% = 101 if checked(106)=1 then s1$ = caption$(106) : ' "verbe" if checked(107)=1 then s1$ = caption$(107) : ' "nom" if trim$(text$(103))="" clear 12 item_add 12,"Tu as oublié de spécifier le mot !" show 11 return end_if s$ = trim$(text$(103)) if checked(107)=1 if count(x_noms%)=0 item_add x_noms%, s$ else for i%=1 to count(x_noms%) if s$=item_read$(x_noms%,i%) clear 12 item_add 12,"<"+s$+"> est déjà un nom connu." show 11 return end_if next i% for i%=1 to count(x_verbes%) if s$=item_read$(x_verbes%,i%) clear 12 item_add 12,"<"+s$+"> est déjà connu comme verbe." show 11 return end_if next i% item_add x_noms%, s$ end_if end_if if checked(106)=1 if count(x_verbes%)=0 item_add x_verbes%, s$ else for i%=1 to count(x_verbes%) if s$=item_read$(x_verbes%,i%) clear 12 item_add 12,"<"+s$+"> est déjà un verbe connu." show 11 return end_if next i% for i%=1 to count(x_noms%) if s$=item_read$(x_noms%,i%) clear 12 item_add 12,"<"+s$+"> est déjà connu comme nom." show 11 return end_if next i% item_add x_verbes%, s$ end_if end_if message "Je valide la déclaration:"+crlf$+"Je déclare que <"+s$+"> est un "+s1$ hide 101 active 1 : active 2 : active 3 : active 4 return b_abandonner_affirmation: hide 201 active 1 : active 2 : active 3 : active 4 return
b_valider_affirmation: onglet% = 201 s1$ = trim$(text$(204)) s2$ = trim$(text$(206)) s3$ = trim$(text$(208)) bool$ = text$(210) s$ = s1$ gosub chercher_nom if res%=0 clear 12 item_add 12,"Je ne connais pas le nom <"+s1$+">." show 11 return end_if s$ = s2$ gosub chercher_verbe if res%=0 clear 12 item_add 12,"Je ne connais pas le verbe <"+s2$+">." show 11 return end_if s$ = s3$ gosub chercher_nom if res%=0 clear 12 item_add 12,"Je ne connais pas le nom <"+s3$+">." show 11 return end_if s$ = s1$+"|"+s2$+"|"+s3$+"#"+bool$ if count(x_affirmations%)>0 for i%=1 to count(x_affirmations%) if s$=item_read$(x_affirmations%,i%) clear 12 item_add 12,"Je sais déjà que" item_add 12," <"+s1$+" "+s2$+" "+s3$+"> est "+bool$+" !" show 11 return end_if next i% end_if message "Je valide l'affirmation: <"+s1$+" "+s2$+" "+s3$+"> est "+bool$ item_add x_affirmations%,s$ hide 201 active 1 : active 2 : active 3 : active 4 return
b_abandonner_question: hide 301 active 1 : active 2 : active 3 : active 4 return
b_valider_question: onglet% = 301 s1$ = trim$(text$(304)) s2$ = trim$(text$(306)) s3$ = trim$(text$(308)) bool$ = text$(310) s$ = s1$ gosub chercher_nom if res%=0 clear 12 item_add 12,"Je ne connais pas le nom <"+s1$+">." show 11 return end_if s$ = s2$ gosub chercher_verbe if res%=0 clear 12 item_add 12,"Je ne connais pas le verbe <"+s2$+">." show 11 return end_if s$ = s3$ gosub chercher_nom if res%=0 clear 12 item_add 12,"Je ne connais pas le nom <"+s3$+">." show 11 return end_if if bool$ = "vrai" bool1$ = "faux" else bool1$ = "vrai" end_if clear 12 s$ = s1$+"|"+s2$+"|"+s3$+"#"+bool$ flag% = 0 if count(x_affirmations%)>0 for i%=1 to count(x_affirmations%) if s$=item_read$(x_affirmations%,i%) item_add 12,"Je sais que " item_add 12," <"+s1$+" "+s2$+" "+s3$+"> est "+bool$+" !" item_add 12,"est vrai." flag% = 1 exit_for end_if next i% end_if s$ = s1$+"|"+s2$+"|"+s3$+"#"+bool1$ if count(x_affirmations%)>0 for i%=1 to count(x_affirmations%) if s$=item_read$(x_affirmations%,i%) item_add 12,"Je sais que " item_add 12," <"+s1$+" "+s2$+" "+s3$+"> est "+bool$+" !" item_add 12,"est faux." flag% = 1 exit_for end_if next i% end_if if flag%=0 item_add 12,"L'affirmation" item_add 12," <"+s1$+" "+s2$+" "+s3$+"> est "+bool$+" !" item_add 12,"m'est inconnue." end_if show 11 return
b_abandonner_interrogation: hide 401 active 1 : active 2 : active 3 : active 4 return
b_valider_interrogation: onglet% = 401 hide 401 clear 12 if checked(403)=1 item_add 12,"Mes connaissances:" item_add 12,"" if count(x_noms%)=0 item_add 12,"Je ne connais aucun nom." else item_add 12,"Je connais les noms suivants:" for i%=1 to count(x_noms%) item_add 12,item_read$(x_noms%,i%) next i% end_if item_add 12,"" if count(x_verbes%)=0 item_add 12,"Je ne connais aucun verbe." else item_add 12,"Je connais les verbes suivants:" for i%=1 to count(x_verbes%) item_add 12,item_read$(x_verbes%,i%) next i% end_if item_add 12,"" if count(x_affirmations%)=0 item_add 12,"Je ne connais aucune affirmation." else item_add 12,"Je connais les affirmations suivantes:" for i%=1 to count(x_affirmations%) s1$ = "<"+item_read$(x_affirmations%,i%) gosub decoder_affirmation item_add 12,s1$ next i% end_if item_add 12,"" item_add 12,"C'est tout." show 11 return else s$ = trim$(text$(405)) clear 12 item_add 12,"Ce que je sais sur <"+s$+">" if count(x_noms%)=0 item_add 12,"Je ne connais pas le nom <"+s$+">" else for i%=1 to count(x_noms%) if s$=item_read$(x_noms%,i%) item_add 12,"<"+s$+"> est un nom" i% = 0 exit_for end_if next i% if i%>0 then item_add 12,"<"+s$+"> n'est pas un nom" end_if if count(x_verbes%)=0 item_add 12,"Je ne connais pas le verbe <"+s$+">" else for i%=1 to count(x_verbes%) if s$=item_read$(x_verbes%,i%) item_add 12,"<"+s$+"> est un verbe" i% = 0 exit_for end_if next i% if i%>0 then item_add 12,"<"+s$+"> n'est pas un verbe" end_if if count(x_affirmations%)=0 item_add 12,"Je ne connais pas l'affirmation sur <"+s$+">" else item_add 12,"" for i%=1 to count(x_affirmations%) if instr(item_read$(x_affirmations%,i%),s$)>0 s1$ = "<"+item_read$(x_affirmations%,i%) gosub decoder_affirmation item_add 12,s1$ end_if next i% end_if item_add 12,"Je n'en sais pas plus." show 11 return end_if active 1 : active 2 : active 3 : active 4 return
b_declaration: inactive 1 : inactive 2 : inactive 3 : inactive 4 show 101 return b_affirmation: inactive 1 : inactive 2 : inactive 3 : inactive 4 show 201 return b_question: inactive 1 : inactive 2 : inactive 3 : inactive 4 show 301 return
b_interrogation: inactive 1 : inactive 2 : inactive 3 : inactive 4 show 401 return
chercher_nom: res% = 0 if count(x_noms%)=0 then return for i%=1 to count(x_noms%) if s$=item_read$(x_noms%,i%) res% = i% return end_if next i% res% = 0 return chercher_verbe: res% = 0 if count(x_verbes%)=0 then return for i%=1 to count(x_verbes%) if s$=item_read$(x_verbes%,i%) res% = i% return end_if next i% res% = 0 return
decoder_affirmation: j% = instr(s1$,"#") s1$ = left$(s1$,j%-1)+"> est "+mid$(s1$,j%+1,len(s1$)) j% = instr(s1$,"|") s1$ = left$(s1$,j%-1)+" "+mid$(s1$,j%+1,len(s1$)) j% = instr(s1$,"|") s1$ = left$(s1$,j%-1)+" "+mid$(s1$,j%+1,len(s1$)) return Ah, j'oubliais: il y a des variables à configurer pour l'emplacement du fichier de base de connaissance, et le programme s'exprime à la première personne. Amusez-vous bien... | |
|