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

  1. #1
    Membre du Club
    problème d'utilisation de atomic_list_concat/3 après findall/3 : afficher la liste.
    Bonjour, en vous souhaitant bon weekend.


    J'ai un problème d'utilisation de atomic_list_concat/3 après l'appel de findall/3.

    Je fournie à atomic_list_concat/3 la liste sortant de findall mais atomic_list_concat/3 me dit qu'un texte est attendu.

    j'utilise un prédicat lire/3 qui ce décrit comme suit : lire(Sujet, Verbe, Complément) dont Sujet et verbe sont des atom et Complément est une liste.

    je fais donc ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    findall(C, lire(Sujet, Verbe, C), Goal),
    length(Goal, Len),
         (Len \= 0 ->
              atomic_list_concat(Goal, ' ', Comp),
          write(Comp), write(' ?'))


    L'erreur affiché par Prolog est la suivante :
    ERROR: atomic_list_concat/3: Type error: `text' expected, found `[un,abricot]' (a list)
    Je comprends pas. Ca devrait fonctionner. Alors je viens demander un secour.

    S'il vous plait !

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

  2. #2
    Membre du Club
    Ah ! Ah !

    Goal est une liste de liste donc !

    alors j'ai procédé comme suit :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pprint(Sujet, Verbe, List, N) :-
        nth0(N, List, E),
        atomic_list_concat(E, ' ', Comp),
        atomic_list_concat([Sujet, Verbe, Comp], ' ', Result),
        write(Result), write(' !').


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    findall(C, lire(Sujet, Verbe, C), Goal),
         /* lire(Sujet, Verbe, Goal), */
         length(Goal, Len),
         (Len \= 0 ->
              Last is Len - 1,
              foreach(between(0, Last, X),
                      pprint(Sujet, Verbe, Goal, X))


    Cependant mon programme ne fonctionne toujours pas.

    Si vous souhaitez m'aider, voici un bout de mon code :

    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
    ajouter(Text) :-
        atomic_list_concat(List, ' ', Text),
        defrag(List, Sujet, Verbe, Complément),
        (lire(Sujet, Verbe, Complément) ->
             /* Affirmation */
             write("Yes. "),
             write(Text), writeln(' !')
         ;
         write("No, "),
         /* Négation */
         findall(C, lire(Sujet, Verbe, C), Goal),
         /* lire(Sujet, Verbe, Goal), */
         length(Goal, Len),
         (Len \= 0 ->
              Last is Len - 1,
              foreach(between(0, Last, X),
                      pprint(Sujet, Verbe, Goal, X))
          ;
          /* Question */
          atomic_list_concat(Complément, ' ', Comp),
          atomic_list_concat([Verbe, Sujet, Comp], ' ', Interrogation),
          write(Interrogation), writeln(" ?"),
          /* écrire nouveau fait */
     
          read(X),
          (X == yes ->  écrire(Sujet, Verbe, Complément) ; true))).
     
    pedialog:-
        read(P),
        ajouter(P),
        pedialog.

    Dans ce code, le prédicat pedialog lit un Text pour appeler ajouter(Text) et se rappelle afin de boucler.

    Le Text attendu doit être de forme [Sujet, Verbe, [Complément]].
    Le prédicat lire/3 est ajouté dynamiquement avec le prédicat écrire/3 après l'intervention de l'utilisateur.


    Voici un exemple de ce qu'il se passe à l'exécution :

    Warning: /home/manu/devel/Projects/psys2/goals.pl:142:
    Singleton variables: [User]
    psys/0 is user control to access shell written with Prolog.
    Program name : [psys]
    Release : 2.1.2.r
    who are you?
    username : arknos.
    what machine are you?
    [animal,computer]
    |: animal.
    what animal are you?
    [human]
    |: human.
    What human are you?
    [men,woman]
    |: woman.
    Assertion woman(X)
    what machine are you?
    [animal,computer]
    |: animal.
    What language are you?
    [bash,tcsh,csh,prolog,other]
    |: other.
    Hello lady arknos!
    We are compatible systems!
    |: "je mange une pomme".
    No, mange je une pomme ?
    |: yes.
    |: "je mange une poire".
    No, je mange une pomme !|: yes.
    arknos!
    We are compatible systems!
    |: "je mange une poire".
    No, je mange une pomme !|: no.

    Warning: /home/manu/devel/Projects/psys2/goals.pl:14: Initialization goal failed
    Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.2.3)
    Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
    SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to redistribute it under certain conditions.
    Please visit http://www.swi-prolog.org for details.

    For help, use ?- help(Topic). or ?- apropos(Word).

    ?-
    Les codes sources sont disponible sur https://sourceforge.net/projects/psys.

    Le fichier principal est nommé "goals.pl".

    Je vous pris de m'excuser pour les explication succinte de débutant en Prolog trop complexe pour moi pour le moment.

    Si vous manquez d'information, je suis jamais très loin.

    Merci pour votre aide.
    Logique sans matière est matière de logique.

  3. #3
    Membre du Club
    Dans l'exemple de traitement ci-dessus, j'ai commit une erreur de compréhension de mon propre programme.

    Je me suis ajouté un prompt :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pedialog:-
        prompt1("you : "),
        read(P),
        ajouter(P),
        pedialog.

    Ce qui donne ceci, je vous passe le problème d'identification,
    Hello lady arknos!
    We are compatible systems!
    you : "je mange une pomme".
    No, mange je une pomme ?
    |: yes.
    you : "je mange une poire".
    No, je mange une pomme !
    you :
    Alors, le problème est que le programme refuse catégoriquement d'ajouter un nouveau fait si Sujet et Verbe construisent déjà un fait.
    Je me repenche sur la question.
    Merci encore pour votre aide.
    Logique sans matière est matière de logique.

  4. #4
    Membre du Club
    simple problème algorithmique
    Finalement, il restait un petit problème algorithmique.

    Code corrigé :
    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
    ajouter(Text) :-
        atomic_list_concat(List, ' ', Text),
        defrag(List, Sujet, Verbe, Complément),
        (lire(Sujet, Verbe, Complément) ->
             /* Affirmation */
             write("Yes. "),
             write(Text), writeln(' !')
         ;
         /* Négation */
         findall(C, lire(Sujet, Verbe, C), Goal),
         /* lire(Sujet, Verbe, Goal), */
         length(Goal, Len),
         (Len \= 0 ->
              writeln("No, but : "),
              Last is Len - 1,
              foreach(between(0, Last, X),
                      pprint(Sujet, Verbe, Goal, X)),
              /* Question */
              atomic_list_concat(Complément, ' ', Comp),
              atomic_list_concat([Verbe, Sujet, Comp], ' ', Interrogation),
              write(Interrogation), writeln(" ?"),
     
              /* écrire nouveau fait */
              read(X),
              (X == yes ->  écrire(Sujet, Verbe, Complément) ; true)
          ;
          write("No, : "),
          /* Question */
          atomic_list_concat(Complément, ' ', Comp),
          atomic_list_concat([Verbe, Sujet, Comp], ' ', Interrogation),
          write(Interrogation), writeln(" ?"),
     
          /* écrire nouveau fait */
          read(X),
          (X == yes ->  écrire(Sujet, Verbe, Complément) ; true))).



    Dans le code ci-dessus j'ai simplement copié le paragraphe "Question" à la suite de celui de la "Négation"

    Et j'obtiens :

    Hello lady arknos!
    We are compatible systems!
    you : "je mange une pomme".
    No, : mange je une pomme ?
    |: yes.
    you : "je mange une poire".
    No, but : je mange une pomme !
    mange je une poire ?
    |: yes.
    you :

    Merci pour votre aide.
    Logique sans matière est matière de logique.