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 :

[Swi-Prolog] problème de passage de paramettres du programme principal.


Sujet :

Prolog

  1. #1
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut [Swi-Prolog] problème de passage de paramettres du programme principal.
    Bonjour,

    J'ai un problème avec un programme principal pour passer les "paramètres" à mes prédicats.

    j'ulise read_string/5 pour saisir une ligne de text ; End est le dernier caractère saisie avant "enter".
    j'ulise en suite split_string/4 pour décomposer la ligne de text en liste d'atome.

    Je veux passer cette liste pour traiter uniquement le premier atome ; Mes prédicats principaux sont définit de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    no([X|_], S) :- no, writeln(X), no_analyze(X, S).
    yes([X|_], A) :- yes, writeln(X), yes_analyze(X, A).
    Ces prédicat fonctionne depuis l'interpréteur, mais pas en interne.

    Le code complet du programme principal :

    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
     
    affirmative(List, End) :- End == 33; End == 46.
     
    interrogative(List, End) :- End == 63.
     
    input_to_list(String, List) :-
        split_string(String, "-', ", ",\s", List).
     
    output_to_list(String, List) :-
        split_string(String, "-', ?!.", ",\s", List).
     
     
    main(R) :-
        read_string(user_input, "!.?", """\n", End, String),
        writeln(End),
        output_to_list(String, List),
        writeln(List),
        (
            affirmative(List, End) ->
                yes(List, R) ;
     
            interrogative(List, End) ->
                no(List, R)
        ).
    Au cas ou vous souhaitiez tester, voici les code de la base de faits et leurs règles :

    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
     
    antinomie(negative, positive).
    antinomie(no, yes).
    antinomie(true, false).
     
     
    antinomie(peace, war).
    antinomie(dead, life).
     
    synonyme(no, negative).
    synonyme(negative, false).
     
    synonyme(yes, positive).
    synonyme(positive, true).
     
    synonyme(affirmative, positive).
     
    synonyme(love, like).
    synonyme(war, dead).
    synonyme(life, will).
     
    search_antinomie(Left, Right) :- (antinomie(Left, Right), !
                                      ; antinomie(Right, Left)).
     
    search_synonyme(Left, Right) :- (synonyme(Left, Right), !
                                     ; synonyme(Right, Left)).
     
    no_analyze(X, S) :-
        writeln(X),
        (search_synonyme(X, Y),
         search_antinomie(Y, A),
         search_synonyme(A, S), !
         ;
         search_antinomie(X, S)).
     
    yes_analyze(X, A) :-
        writeln(X),
        (search_antinomie(X, Y),
         search_synonyme(Y, S),
         search_antinomie(S, A), !
         ;
         search_synonyme(X, A)).
     
    no :- write('no, ').
    yes :- write('yes, ').

    Voici un court extrait de mes commandes :

    ?- yes([yes], A).
    yes, yes
    yes
    A = positive.

    ?- no([no], A).
    no, no
    no
    A = true.

    ?- main(X).
    |: yes !
    33
    [yes]
    yes, yes
    yes
    false.

    ?- main(X).
    |: no !
    33
    [no]
    yes, no
    no
    false.

    ?-
    Je n'ai aucune idée de ce qui cloche. Si vous saviez m'aider, vous m'avanceriez.

    Merci.
    Logique sans matière est matière de logique.

  2. #2
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut il suffis d'utiliser atom_codes pour convertire chaque terme de la ligne de texte.
    Bonsoir,

    Ainsi mon prédicat output_list/2 utilise le prédicat atom_codes/2 pour convertir un term en atome.

    j'ai fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    output_to_list(String, List) :-
        split_string(String, "-', ?!.", ",\s", String_List),
        length(String_List, Length),
        length(List, Length),
        foreach(between(1, Length, Index),
                (nth1(Index, String_List, S),
                 nth1(Index, List, A),
                 atom_codes(A, S))).
    Merci. désolé encore du dérangement.
    (Je suis aprti me balader et chemin faisant, n'ayant pas bien lu la documentation de split_string, je me suis dit : autant, il sort pas des atom, mais des chaînes, et voilà.).
    Logique sans matière est matière de logique.

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

Discussions similaires

  1. SWI-Prolog Interface C++ problème linker
    Par smarlytomtom dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 26/04/2017, 13h53
  2. [Python 2.X] Problème avec interfaçage DJANGO et SWI-PROLOG
    Par Triton972 dans le forum Django
    Réponses: 10
    Dernier message: 23/01/2015, 10h11
  3. Probleme passage de Eclipse prolog a SWI-Prolog
    Par Mattorre dans le forum Prolog
    Réponses: 7
    Dernier message: 12/12/2010, 20h31
  4. Passage de TurboProlog à Swi-Prolog
    Par Hello_World dans le forum Prolog
    Réponses: 6
    Dernier message: 25/03/2009, 19h09
  5. problème de passage de texte avec getvariable
    Par VincentB dans le forum Flash
    Réponses: 2
    Dernier message: 12/01/2004, 18h35

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