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 :

Appeler une fonction à l'intérieur d'un branchement


Sujet :

Prolog

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut Appeler une fonction à l'intérieur d'un branchement
    Bonsoir les ami(es)

    comment procéder pour appeler une fonction à l'interieur d'un branchement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    run:write('enter a choice'),nl,nl,
    write('a.Internet Connection'),nl,
    write('b.Sharing Problem'),nl,
    read(Choice),cl,
    choice(Choice),nl,nl.
    choice(a):-  /*insérer ici une fonction*/
    choice(b):-  /*insérer ici une fonction*/
    ....


    Mille fois Merci

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Tu souhaite voir quoi exactement comme condition de choice(a) ?
    Je ne sais pas exactement dans quel Prolog tu codes et je peux me tromper, mais pour moi une fonction c'est quelque chose qui renvoie une valeur, et il y en a assez peu en Prolog, qui fonctionne surtout par prédicats.

    Le code suivant par exemple (en SWI Prolog), appelle une fonction (sinus) pour afficher son résultat à l'aide d'un prédicat à effets de bord (write) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choice(a) :-
      X is sin(3),
      write(X).
    Je ne suis pas sûr que ça t'aide beaucoup. Explique-nous un peu plus précisément ce que tu voudrais faire.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Eusebius Voir le message
    Tu souhaite voir quoi exactement comme condition de choice(a) ?
    Je ne sais pas exactement dans quel Prolog tu codes et je peux me tromper, mais pour moi une fonction c'est quelque chose qui renvoie une valeur, et il y en a assez peu en Prolog, qui fonctionne surtout par prédicats.

    Le code suivant par exemple (en SWI Prolog), appelle une fonction (sinus) pour afficher son résultat à l'aide d'un prédicat à effets de bord (write) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choice(a) :-
      X is sin(3),
      write(X).
    Je ne suis pas sûr que ça t'aide beaucoup. Explique-nous un peu plus précisément ce que tu voudrais faire.

    Merci d'avoir répondu

    non je sais comment utiliser swi prolog pour renvoyer une valeure. Ce que je voudrais savoir, par contre, c'est comment inserer un petit programme pour chaque choix.

    pour illustrer ma requête je travaille sur un petit programme qui simule un troubleshooting expert system et je souhaite faire comme ce qui suit

    choix a :internet connection problem
    choix b: sharing problem

    voilà a prioris mon programme

    encore merci

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Salut,

    Je suis navré mais ça n'est pas beaucoup plus clair pour moi. Es-tu sûr de bien comprendre le fonctionnement de prolog, qu'on parte sur les mêmes bases ?

    Peut-être qu'un autre membre du forum te comprendra mieux que moi.

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Le fait est que Prolog n'est pas un langage procédural et qu'il semblerait que tu ne l'utilises pas correctement.

    En Prolog il est principalement question de logique.

    Lorsque tu définis un prédicat, il sera vrai si toutes les conditions qu'il contient le sont.
    Penses-tu que c'est adapté à ton architecture de choix qui se résoudrait en un simple if dans un autre langage ?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Alp Voir le message
    Le fait est que Prolog n'est pas un langage procédural et qu'il semblerait que tu ne l'utilises pas correctement.

    En Prolog il est principalement question de logique.

    Lorsque tu définis un prédicat, il sera vrai si toutes les conditions qu'il contient le sont.
    Penses-tu que c'est adapté à ton architecture de choix qui se résoudrait en un simple if dans un autre langage ?
    Je suis encore debutant en prolog mais je sais qu'il s'agit d'un langage logique. Au fait, l'idée de mon programme est simple je cherche à faire juste un menu afin que l'utilisateur puisse choisir entre les deux options suivantes

    Network Troubleshooting
    Sharing Troubleshooting

    les deux petits programmes sont en prolog et j'aimerais bien faire un menu pour la selection

    'a. Network Troubleshooting'
    'b. Sharing Troubleshooting'

    est - il possible de le faire en prolog

    Merci

  7. #7
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par bonomsoleil Voir le message
    les deux petits programmes sont en prolog et j'aimerais bien faire un menu pour la selection
    Admettons que "network troobleshooting" et "sharing troobleshooting" aient été écrits sous la forme de deux prédicats "network/0" et "sharing/0" (c'est-à-dire des prédicats sans argument).

    supposons alors que tu fais ça dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    choice(a) :- network.
    choice(b) :- sharing.
    Si l'utilisateur rentre "a" pour Choice, alors Prolog va unifier "choice(Choice)" avec "choice(a)", et donc, pour vérifier sa valeur de vérifier, va vérifier celle de "network" et exécuter le programme Prolog correspondant.

    Encore une fois, comme on ne connaît pas l'interface ni les spécifications de tes deux programmes existants, on ne peut pas te dire grand-chose de plus que des généralités.

    Si tu es débutant en Prolog, je te conseille vivement ce tuto, de niveau "débutant", au cas où tu ne sois pas au clair avec tout ce qu'il y a dedans : Le langage Prolog

  8. #8
    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
    Salut.

    Est-ce genre de chose que tu recherches ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    test :-
    	repeat,
    	write('enter a choice'),nl,nl,
    	write('a.Internet Connection'),nl,
    	write('b.Sharing Problem'),nl,
    	write('c.exit'),nl,
    	read(Choice),nl, nl,
    	choice(Choice),
    	Choice = 'c'.
     
    choice(a):- 
    	!, write('Choice a.'), nl, nl.
     
    choice(b):-  
    	!, write('choice b.'), nl, nl.
     
    choice(c) :-
    	!, write('This is the end.'), nl.
     
    choice(_) :-
    	write('Please type ''a'' or ''b'' or ''c'' !'), nl, nl.
    sortie :
    3 ?- test.
    enter a choice

    a.Internet Connection
    b.Sharing Problem
    c.exit

    |: a.

    Choice a.

    enter a choice

    a.Internet Connection
    b.Sharing Problem
    c.exit

    |: b.

    choice b.

    enter a choice

    a.Internet Connection
    b.Sharing Problem
    c.exit

    |: e.

    Please type 'a' or 'b' or 'c' !

    enter a choice

    a.Internet Connection
    b.Sharing Problem
    c.exit

    |: c.

    This is the end.

    Yes
    "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

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    merci à vous tous

    voilà les deux programmes que je voudrais mettre dans le menu

    network
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    go:- initialize,
      collect_symptoms,
      rule(Number,Fault),
      reply(Fault,Reply),
      write(Reply),nl,
      write('The rule used was number'),
      write(Number),nl,nl,
      retractall(symptom(_)).
     
    go:-
      write('Sorry cannot help'),nl,nl,
      retractall(symptom(_)).
     
    initialize:-
      put(12),
      write('*** Troubleshooting Network Expert System ***'),nl,nl,
      write('assuming there is no internet connection '),
      write('please answer the following questions'),
      write('with y(yes) or n(no).').
     
    collect_symptoms:-
      question(Ques,Sympt)
      ,write(Ques),nl,
      getyesno(Yesno),nl,Yesno=y,
      assertz(symptom(Sympt)),fail.
     
    collect_symptoms.
     
    getyesno(X):-
      repeat,
      write('Please answer y or n:'),
      read(Z),nl,
      check(Z),X=Z,!.
     
    check(y).
    check(n).
     
     
    question('There is no red cross on the screen?',red_cross).
    question('The Wall Cable is not connected?',wall_cable).
    question('The Cable is not connected to your Computer?',computer_cable).
    question('The Administrator of the Network has internet connection?',check_admin).
    question('Your Firewall is not disabled?',fwall_disabled).
    question('Your Antivirus is not disabled?',antivirus_disabled).
     
     
     
    rule(1,red_cross):-
    not(symptom(wall_cable)).
     
    rule(2,wall_cable):-
    symptom(red_cross), 
    symptom(wall_cable).
     
    rule(3,computer_cable):-
    symptom(red_cross), 
    symptom(wall_cable),
    symptom(computer_cable).
     
    rule(4,check_admin):-
    symptom(red_cross),
     not(symptom(wall_cable)),
     not(symptom(computer_cable)). 
     
    rule(5,fwall_disabled):-
    symptom(red_cross), 
    not(symptom(wall_cable)),
    not(symptom(computer_cable)),
    not(symptom(check_admin)),
    not(symptom(fwall_disabled)).
     
    rule(6,antivirus_disabled):-
    symptom(red_cross), 
    not(symptom(wall_cable)),
    not(symptom(computer_cable)),
    not(symptom(check_admin)),
    not(symptom(fwall_disabled)),
    not(symptom(antivirus_disabled)).
     
     
    reply(red_cross,'Check your wall cable.').
    reply(wall_cable,'check your wall cable').
    reply(computer_cable,'check your computer cable').
    reply(check_admin,'check with your Network Administrator').
    reply(fwall_disabled,'disable your firewall').
    reply(anti_virus,'disable your antivirus').

    sharing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    initialize2:-
      put(12),
      write('*** Troubleshooting Network Expert System ***'),nl,nl,
      write('assuming there is no sharing between computers'),
      write('please answer the following questions'),
      write('with y(yes) or n(no).').
     
      collect_symptoms:-
      question(Ques,Sympt)
      ,write(Ques),nl,
      getyesno(Yesno),nl,Yesno=y,
      assertz(symptom(Sympt)),fail.
     
    collect_symptoms.
     
    getyesno(X):-
      repeat,
      write('Please answer y or n:'),
      read(Z),nl,
      check(Z),X=Z,!.
     
    check(y).
    check(n).
     
    question('The error is saying access deny ?',access_deny).
    question('The error is saying no net provider?',net_provider).
     
    rule(1,access_deny):-symptom(access_deny).
    rule(2,net_provider):-symptom(net_provider).
     
    reply(access_deny,'try to change share properties on the folder').
    reply(net_provider,'ping the host computer').

  10. #10
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Il faudrait sans doute tout simplement faire ça, si "go" est le point d'entrée de ton "système expert" pour les problèmes de réseau et "initialize2" le point d'entrée pour les problèmes de partage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    choice(a) :- go.
    choice(b) :- initialize2.
    Ceci dit je n'ai pas fait d'analyse exhaustive du code que tu nous a donné, mais j'ai l'impression que "go", justement, peut donner des réponses multiples : dans tous les cas il peut afficher "Sorry cannot help". Il faudrait peut-être vérifier avant qu'on n'est pas dans une situation où on peut faire quelque chose.

  11. #11
    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
    Peut-être peux-tu t'inspirer de ce qu'avais écrit la P.O. de ce thread. Le code intéressant pour toi est au message N°5.
    "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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/03/2008, 16h00
  2. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  3. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  4. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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