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 :

Appel de prédicats / règles prolog via http


Sujet :

Prolog

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Par défaut Appel de prédicats / règles prolog via http
    Bonjour,

    depuis plusieurs jours je suis bloqué par le problème suivant: je souhaite interroger une instance unique de prolog contenant de nombreux prédicats et règles à travers un système de socket.
    Les prédicats et règles étant partagées entre les clients et particulièrement nombreux je préfère ne pas mettre en oeuvre un système de chargement des données par fichier (il pourrait y avoir plusieurs milliers de requetes par seconde).
    Les librairies Prolog proposent tout ce qu'il faut pour construire un serveur qui écoute les appels sur une socket, gère des files d'attentes... mais jusqu'à présent je n'ai pas réussi à exécuter une requête sur un prédicat ou une règle connue par prolog. Je pense ne pas être très loin, et un œil extérieur pourra sans doute trouver le détail qui me manque : le client


    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
     
    :- use_module(library(socket)).
    :- use_module(library(streampool)).
     
    server(Port) :-
            tcp_socket(Socket),
    	tcp_bind(Socket, Port),
            tcp_listen(Socket, 5),
            tcp_open_socket(Socket, In, _Out),
            add_stream_to_pool(In, accept(Socket)),
            stream_pool_main_loop.
     
    accept(Socket) :-
            tcp_accept(Socket, Slave, Peer),
            tcp_open_socket(Slave, In, Out),
            add_stream_to_pool(In, client(In, Out, Peer)).
     
    client(In, Out, _Peer) :-
            read_line_to_codes(In, Command),
            close(In),
    	write(Out, animal(Command)),
            close(Out),
     
    cat(tom).
    animal(X) :- cat(X).
    J'ai tenté des appels via call, sans résultat.

    D'avance merci pour vos idées.

    Cdt,

    jfv

  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
    Par défaut
    Avant de me pencher plus avant sur ton code avais-tu vu ce post ?
    Peut-être y trouveras-tu les réponses que tu attends.

    [EDIT] Tu as une erreur de syntaxe à la fin de la ligne précédent cat(tom), tu as mis une virgule au lieu d'un point ! [/EDIT]
    "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
    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
    Par défaut
    J'ai un peu modifié ton prog pour gérer les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    client(In, Out, _Peer) :-
            read_line_to_codes(In, Command),
            close(In),
    	string_to_atom(Command, CA),
    	catch(call(CA, A),
    	      A,
    	      format(Out, 'Erreur de saisie ~w~n', [A])),
    	write(Out,A),
            close(Out).
    "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

  4. #4
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Par défaut Merci
    Merci pour ta solution et pour ta réactivité, je vais repartir du code que tu propose pour finir de l'adapter à mon besoin. Ca marche bien maintenant.

    Joyeuses fêtes à tous,

    cdt,

    jfv

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Par défaut
    re-Bonjour,

    la solution proposée pour la calcatrice fonctionne bien, par contre, je n'arrive pas à l'adapter à mon besoin passer en paramètre via telnet non seulement les paramètes mais aussi la question: exemple cat(tom) : j'ai l'impression que l'évaluation des règles est bien faite, mais je n'arrive pas à obtenir la réponse, au mieux je récupère un code du type G280.

    Merci de vos idées.

    cdt,

    jfv

  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
    Par défaut
    Tu peux poster le code à jour du serveur et du client ?
    "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
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Par défaut
    Bonjour,

    pour le serveur, j'ai repris le code initial et l'ai complté à l'aide des propositions faites précédemment, comme suit:

    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
    cat(tom).
    cat(tim).
    dog(waf).
     
    pet(X):- call(cat(X)).
     
     
    :- use_module(library(socket)).
    :- use_module(library(streampool)).
     
    server(Port) :-
            tcp_socket(Socket),
    	tcp_bind(Socket, Port),
            tcp_listen(Socket, 5),
            tcp_open_socket(Socket, In, _Out),
            add_stream_to_pool(In, accept(Socket)),
            stream_pool_main_loop.
     
    accept(Socket) :-
            tcp_accept(Socket, Slave, Peer),
            tcp_open_socket(Slave, In, Out),
            add_stream_to_pool(In, client(In, Out, Peer)).
     
    client(In, Out, _Peer) :-
            read_line_to_codes(In, StringCommand),
            read_line_to_codes(In, StringParam),
            close(In),
    	string_to_atom(StringCommand,AtomS),
    	string_to_atom(StringParam,AtomP),
    	catch(call(AtomS,AtomP,A),
    	      A, 
    	      format('Erreur de saisie ~a~n', A)),
            format(Out, '~w~n', [A]),
    	format('Calcul demandé : ~w~n', [A]),
    	close(Out).
    pour le client, je fais juste un telnet localhost 5000 (après avoir lancé le serveur sur le même port bien sur). puis j'entre mes atomes sous la forme:
    cat
    tom

    D'avance merci de vos propositions

  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
    Par défaut
    Voici quelque chose qui fonctionne chez moi :
    le serveur :
    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
    :- use_module(library(socket)).
    :- use_module(library(streampool)).
     
    cat(tom).
    cat(tim).
    dog(waf).
     
    pet(X):- call(cat(X)).
     
    init :-
    	server(5000).
    server(Port) :-
            tcp_socket(Socket),
    	writeln(Socket),
    	tcp_bind(Socket, Port),
            tcp_listen(Socket, 5),
            tcp_open_socket(Socket, In, _Out),
            add_stream_to_pool(In, accept(Socket)),
            stream_pool_main_loop.
     
    accept(Socket) :-
            tcp_accept(Socket, Slave, Peer),
            tcp_open_socket(Slave, In, Out),
            add_stream_to_pool(In, client(In, Out, Peer)).
     
    client(In, Out, _Peer) :-
            read_line_to_codes(In, Command),
            close(In),
    	string_to_atom(Command, CA),
    	catch(call(CA, A),
    	      A,
    	      format(Out, 'Erreur de saisie ~w~n', [A])),
    	write(Out,A),
            close(Out).
    Dans un autre fichier, le client :
    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
    create_client(Host, Port) :-
    	% boucle de connexion
    	repeat,
            tcp_socket(Socket),
            tcp_connect(Socket, Host:Port),
            tcp_open_socket(Socket, ReadFd, WriteFd),
    	write('Tapez quelque chose, (0 pour cesser) '),
    	read_line_to_codes(user_input, X),
    	format(WriteFd, '~s~n', [X]),
    	flush_output(WriteFd),
    	read_line_to_codes(ReadFd, Lst),
    	string_to_list(Command, Lst),
    	writeln(Command),
            close(ReadFd),
            close(WriteFd),
    	string_to_list("0", X).
     
    calcul :-
    	create_client('localhost', 5000).
    Voici ce que j'obtiens pour le client :
    2 ?- calcul.
    Tapez quelque chose, (0 pour cesser) pet
    tom
    Tapez quelque chose, (0 pour cesser) cat
    tom
    Tapez quelque chose, (0 pour cesser)
    "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 averti
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Par défaut
    Bonjour,

    ça commence à s'approcher de ce que je souhaite, je retrouve bien le premier résultat qd j'interroge le serveur avec "cat" par exemple. Je pense qu'en utilisant un findall, je devrais pouvoir sans trop de difficultés pouvoir obtenir la liste des résultats.

    Par contre, je souhaiterai également pouvoir passer des paramètres pour avoir des réponses comme par exemple envoyer au serveur cat(tom) et recevoir en retour true ou false.

    Cela semble-il faisable ?

    cdt,

    jfv

  10. #10
    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
    Par défaut
    Bien sur, il faut bricoler un peu c'est tout.
    Essaye d'instaurer un dialogue de connexion, afficher des messages pour aider à la saisie.
    "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. Appel d'un web service via HTTPS
    Par IMPRO dans le forum Services Web
    Réponses: 0
    Dernier message: 17/03/2014, 11h11
  2. Comment envoyer une requête POST via HTTP ?
    Par pdtor dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2005, 05h54
  3. Comment afficher une image à la volée via http ?
    Par reg11 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 30/06/2005, 09h44
  4. IOR via http?
    Par Spoutnik dans le forum CORBA
    Réponses: 4
    Dernier message: 31/01/2005, 17h44
  5. [web] rapatrier un document via HTTP
    Par ddhia dans le forum Web
    Réponses: 2
    Dernier message: 08/04/2003, 11h01

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