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
    Homme Profil pro
    codeur
    Inscrit en
    mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut Erreur : out of stack à l'exécution de mon programme
    Bonjour, ou bonsoir.
    J'ai des difficulté à terminer cette partie de mon programme.
    A l'exécution, Prolog aboutie sur une erreur : out of stack.

    Voici mon programme :

    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
     
    :- dynamic ( sujet/1 ).
    :- dynamic ( verbe/1 ).
    :- dynamic ( complément/1 ).
    :- dynamic ( lire/3 ).
     
    ajouter(Sujet, Verbe, Complément) :-
        (not(verbe(Verbe) ->
                 assertz((verbe(Verbe))))),
        (not(sujet(Sujet) ->
                 assertz((sujet(Sujet))))),
        assertz((complément(Complément))),
        assertz((lire(Sujet, Verbe, Complément))).
     
    list_append(L, E, Result) :- append(L, E, Result).
     
    add(From, Nth, Result) :- nth0(Nth, From, E),
                              list_append(Result, E, Result).
     
     
    affirmation(List, Sujet, Verbe, Complément) :-
        nth0(1, List, Sujet),
        nth0(2, List, Verbe),
        length(List, Last),
        (Last > 2 ->
             foreach(between(3, Last, X),
                     add(List, X, Complément))
         ;
         writeln("Insuffisemment instanciés.")).
     
     
    interrogation(List, Sujet, Verbe, Complément) :-
        nth0(1, List, Verbe),
        nth0(2, List, Sujet),
        length(List, Last),
        (Last > 2 ->
             foreach(between(3, Last, X),
                     add(List, X, Complément))
         ;
         writeln("Insuffisemment instanciés.")).
     
    self :-
        prompt1("vous : "),
        read(P),
        split_string(P, " ", "", A),
        affirmation(A, S, V, C).
    /*   ajouter(S, V, C). */
     
     
    pair :-
        prompt1("vous : "),
        read(P),
        split_string(P, " ", "", I),
        interrogation(I, S, V, C),
        lire(S, V, C).
     
     
    main :- self.
    /*      pair,                                                                   
            main. */
    Donc dans affirmation/4, il doit y avoir une erreur pour la boucle foreach, dans add/3 ou list_append/3.

    Mais je n'ai aucune idée de comment résoudre mon problème, ni quel il peut être.

    Merci pour votre aide.
    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 : 49
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut J'ai trouvé mon erreur.
    Bonjour, j'ai trouvé mon erreur.

    J'utilisais nth0/3 et à présent j'utilise nth1/3.

    Cependant mon programme ne fonctionne toujours pas.

    affirmation retournant false, le processus ne poursuit pas son chemin.

    Pourquoi affirmation retourne false ?

    S'il vous plait !!
    Logique sans matière est matière de logique.

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

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Je viens mettre à joour la partie du code qui à changé.
    Mais je ne parviens pas à faire le tour de ma boucle, maintenant avec forall.

    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
     
    add_e_in_l(L, E, R) :- R = [L,[E]].
     
     
    add_nth_to_list(From, Nth, Result) :- nth0(Nth, From, E),
                                          write(E),
                                          add_e_in_l(Result, E, Temp),
                                          Result = Temp.
     
     
     
     
    size([],0).
    size([_|T],N):-
        size(T,M),
        N is M+1.
    size_sub([],[]).
    size_sub([H|T],[N|T2]):-
        size(H,N),
        size_sub(T,T2).
     
    affirmation(List, Sujet, Verbe, Complément) :-
        nth0(0, List, Sujet),
        nth0(1, List, Verbe),
        size(List, Length),
        Complément = [],
        (Length >= 2 ->
             Last is Length - 1,
             forall(between(2, Last, X),
                    add_nth_to_list(List, X, Complément)),
             write(Complément),
             true
        ;
         writeln("Insuffisemment instanciée.")).
    Merci pour votre aide, merci Trap_D si vous passez par là.
    Logique sans matière est matière de logique.

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

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 889
    Points : 6 329
    Points
    6 329
    Par défaut
    Comme je passais par là ...
    Il me faudrait un exemple des éléments utilisés dans affirmation(List, Sujet, Verbe, Complément) pour essayer de corriger.
    Le prédicat size/2 ressemble furieusement au prédicat prédéfini length/2 de Prolog !
    "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
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Bonjour, Trap_D. j'espère que vous allez bien.


    un exemple, je suis supris que vous me demandiez un exemple. Admettons.

    pour affirmation/4 : affirmation([je,mange,une,pomme], Sujet, Verbe, Complément).

    Devrait retourner : (mis à par l'affichae de débug) :

    Sujet = je ;
    Verbe = mange ;
    Complément = [une, pomme]. % ou quelque chose du genre.

    -?
    Logique sans matière est matière de logique.

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

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    J'ai ajouté une ligne dans add_nth_to_list/3 avant d'appeller add_e_in_l/3.


    Ce qui donne pour add_nth_to_list/3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    add_nth_to_list(From, Nth, Result) :- nth0(Nth, From, E),
                                          write(E),
                                          Temp = Result,
                                          add_e_in_l(Result, E, Temp),
                                          Result = Temp.
    Logique sans matière est matière de logique.

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

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 889
    Points : 6 329
    Points
    6 329
    Par défaut
    Je manque d'imagination aussi je préfère travailler sur un exemple sûr.
    Premier chose Complement étant unifié avec la liste vide (Complement = []) sa valeur ne peut plus être changée.
    On peut améliorer l'écriture de certains prédicats :
    Celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add_e_in_l(L, E, R) :- R = [L,[E]].
    s'écrit simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add_e_in_l(L, E, [L,[E]]).
    De même ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    affirmation(List, Sujet, Verbe, Complément) :-
        nth0(0, List, Sujet),
        nth0(1, List, Verbe),
        size(List, Length),
        % Complément = [],
        (Length >= 2 ->
             Last is Length - 1,
             forall(between(2, Last, X),
                    add_nth_to_list(List, X, Complément)),
             write(Complément),
             true
        ;
         writeln("Insuffisemment instanciée.")).
    peut être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    affirmation([Sujet, Verbe | Complement], Sujet, Verbe, Complement).
    La philosophie de Prolog est d'écrire des prédicats qui réussissent ou échouent.
    Votre prédicat affirmation/4 réussit même lorsqu'il y a échec de l'unification car vous affichez un message qui lui "réussit".
    "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

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

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Grand merci Trap_D.
    je vais essayer d'assimiler la philosophie Prolog.
    Logique sans matière est matière de logique.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/05/2008, 19h15
  2. [Eclipse 3.2, créer l'exécutable de mon programme]
    Par ilyassou dans le forum Eclipse
    Réponses: 0
    Dernier message: 25/04/2008, 12h05
  3. Réponses: 2
    Dernier message: 15/12/2007, 16h52
  4. Réponses: 3
    Dernier message: 12/07/2007, 02h40
  5. Réponses: 1
    Dernier message: 13/04/2007, 08h48

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