IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

Executer des "test" en prolog


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Executer des "test" en prolog
    Bonjour,

    J'ai écris un petit programme prolog qui permet d’évaluer une expression logique très simple et basique avec quelques opérateurs (ET, OU, NON par exemple)
    Je souhaiterais maintenant exécuter du code grâce a ce programme mais je ne sais pas trop comment faire.

    Je suis parti dans l'idée d’écrire une commande par ligne dans un txt, lire ligne par ligne et exécuter le contenu de chaque ligne.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a*(b+c),[[a,1],[b,1],[c,1]],X).
    Évalue l'expression : a ET (b OU c) en affectant les valeurs a=1, b=1, c=1. Les résultats sont dans X.
    En général : eval(ExpressionLogique,AssignationValeur,Resultats).

    Je souhaiterais mettre cette ligne dans un txt et l’exécuter à partir de ce dernier (le programme étant charger via consult(eval).).
    J'ai donc bien evidemment rechercher la doc, mais je n'ai pas trouver la partie execution. (http://www.swi-prolog.org/pldoc/man?section=IO)

    Voila ce que j'ai tenter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open('test.txt',read,S).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S = <stream>(0xb5dce0).
    Ainsi ma variable S est supposée contenir le stream sur lequel je peux lire mes commandes.

    Ensuite j'ai cru comprendre que je pouvais lire grace a read/2 mais sans succes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERROR: Arguments are not sufficiently instantiated
    ERROR: In:
    ERROR:    [8] read(_9800,_9802)
    ERROR:    [7] <user>
    Et pour la partie exécution je n'ai pas du tout d'idée, mais je n'arrive meme pas a lire une ligne pour le moment.

    Je vous remercie de votre lecture.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne sais pas si j'ai bien tout compris.
    Je suppose que le code du prédicat "eval" est écrit dans un fichier par exemple dans "code_eval.pl".

    Ce qu'il est possible de faire :
    Déclarer que le fichier code_eval.pl est le code d'un module exportant le prédicat eval, on le fait en mettant en tête du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- module('code_eval.pl', [eval/3]).
    puis d'écrire simplement dans le fichier "eval.pl" les directives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :- use_module('eval.pl').
    :- eval(a*(b+c),[[a,1],[b,1],[c,1]],X).
    L'expression sera automatiquement calculée au chargement par consult('eval.pl').
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci de cette reponse, c'est bien le but recherché en effet.
    Mais ta solution ne fonctionne pas, j'ai du faire une erreur quelque part.

    j'ai mon fichier eval.pl qui contient la definition/declaration du predicat eval/3.
    la premiere ligne de ce fichier est celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- module('eval.pl', [eval/3]).
    et j'ai un fichier test.pl qui contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :- use_module('eval.pl').
    eval(a*(b+c),[[a,1],[b,1],[c,1]],X).
    et a l’exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?- consult(test).
    Warning: CHEMIN/test.pl:1:
    	Local definition of user:eval/3 overrides weak import from 'eval.pl'
    Warning: CHEMIN/test.pl:2:
    	Singleton variables: [X]
    mais le but est bien le suivant, charger le programme contenant eval/3 et exécuter une suite d'instruction pour tester eval/3.

    merci de ton aide !

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je n'ai pas testé puisque je n'ai pas le code de eval/3, mais déjà, dans le fichier test.pl il faut écrire ":-" devant eval...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Je n'ai pas testé puisque je n'ai pas le code de eval/3, mais déjà, dans le fichier test.pl il faut écrire ":-" devant eval...
    En effet, cela a résolut le 1er problème de redéfinition mais pas le second (Singleton Variable).

    Concernant le code de eval/3 ce n'est pas lui qui est en question, puisque lorsque je le charge et que j’exécute eval(a*(b+c),[[a,1],[b,1],[c,1]],X). cela fonctionne parfaitement bien.

    Mais si cela peut être utile, j'ai mis les fichiers en PJ. (ce n'est pas la version finale mais cela devrais aller).

    Merci.
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le problème vient de ce que X n'est plus ensuite utilisée.
    Une solutions possible : faire écrire X, ce qui se fait avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- eval(a*(b+c),[[a,1],[b,1],[c,1]],X),writeln(X).
    Ou alors faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- eval(a*(b+c),[[a,1],[b,1],[c,1]],1).
    ce qui donnera à l'exécution true.

    Attention ne pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- eval(a*(b+c),[[a,1],[b,1],[c,1]],0).
    car le code ne compile pas puisque l'évaluation de eval donne 1 !!!
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Parfait, merci beaucoup, j'ai plus qu'a écrire tous les test possibles !

    Sujet Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo