Prolog
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Prolog



  1. #1
    invite73b93f64

    Prolog


    ------

    Bonjour à tous,

    Je sais que prolog est un langage que peu connaisse mais je tente ma chance... en fait je doit écrire un prédicat dont le premier argument est une liste, et dont le deuxième argument est une liste contenant chaque élément de la première liste écrit deux fois. Par exemple,
    ? - deux f o i s ( [ a , 4 , bidul e ] ,X) .
    X=[a , a , 4 , 4 , bidul e , bidul e ] .
    ? - deux f o i s ( [ 1 , 2 , 3 , 4 ] ,X) .
    X=[ 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 ] .

    Je sais que je dois faire une fonction récursive mais je n'arrive pas a trouver le cas "d'arret"

    si vous pouviez m'aider ca serait sympa


    Voila ce que j'ai écrit pour l'instant :

    deuxFois([A|_],[[A,A]]|_).
    deuxFois([_|A],[_|X]) :- deuxFois(A,X).

    Evidemment ca ne marche pas

    -----

  2. #2
    invite4492c379

    Re : Prolog

    Hello,

    une liste D est le double d'une liste A si

    * A et D sont vides
    * si la tête et la tête de la queue de D sont identiques à la tête de A alors il faut que la queue de la queue de D soit le double de la queue de A

    donc on peut commencer par un :
    Code:
    double([],[]).
    Cela signifie que double avec deux listes vides est vrai.

    ensuite on peut ajouter :
    Code:
    double([A|X],[A,A|Y]) :-
      double(X,Y).
    Prolog te donnera non seulement le double d'une liste avec ce code, mais également la «moitié» d'une liste doublée, ou les valeurs pour qu'une liste soit le double d'une autre :

    Code:
    ?- double([1,2,3],X).
    X = [1, 1, 2, 2, 3, 3].
    
    
    ?- double(X,[1,1,2,2,4,4]).
    X = [1, 2, 4] .
    
    ?- double([A,2,3],[1,1,2,B,C,D]).
    A = 1,
    B = 2,
    C = 3,
    D = 3.
    
    
    
    ?- double([1,2],[1,1,2,3]).
    false.
    
    ?- double([1,2],[A,B,C]).
    false.
    
    
    
    ?- double([1,2,B],C).
    C = [1, 1, 2, 2, B, B].
    Ne raisonne pas en terme de fonction (avec le sens que l'on en a avec des langages de type procédural) mais plutôt en terme de prédicats, base de fait, ...

  3. #3
    MANTA..

    Re : Prolog

    Citation Envoyé par photon57 Voir le message
    Ne raisonne pas en terme de fonction (avec le sens que l'on en a avec des langages de type procédural) mais plutôt en terme de prédicats, base de fait, ...

    Merci de m'avoir répondu aussi rapidement.

    En fait c'est justement ca le probléme, j'ai très bien compris la récursivité en java , c ect... mais j'ai beaucoup de mal a comprendre celle de prolog, je n'arrive pas a voir les différentes étapes par lesquelles il passe pour résoudre le probléme.

    Par exemple quand je fais double([a,b,c],[a,a,b,d,c,c]).

    trace -->
    Code:
       Call: (6) double([a, b, c], [a, a, b, d, c, c]) ? creep
       Call: (7) double([b, c], [b, d, c, c]) ? creep
       Fail: (7) double([b, c], [b, d, c, c]) ? creep
       Fail: (6) double([a, b, c], [a, a, b, d, c, c]) ? creep
    false.
    Au départ, il teste sur: deuxFois([],[]). vue que c'est faux il passe au deuxiéme :

    double([A|X],[A,A|Y]) :- double(X,Y).

    C'est dans cette partie que je ne vois pas ce qu'il fait, il teste la partie de gauche ou la partie de droite en premier?, est-ce que le premier prédicat est ré-utilisé?

  4. #4
    invite4492c379

    Re : Prolog

    Citation Envoyé par MANTA.. Voir le message
    (...)

    Au départ, il teste sur: deuxFois([],[]). vue que c'est faux il passe au deuxiéme :
    Non il n'y a pas de test qui serait faux ... prolog essaye d'unifier [] avec [a,b,c] et [] avec [a,a,b,d,c,c], il n'y arrive pas. Il essaye donc autrement.

    Citation Envoyé par MANTA.. Voir le message
    double([A|X],[A,A|Y]) :- double(X,Y).

    C'est dans cette partie que je ne vois pas ce qu'il fait, il teste la partie de gauche ou la partie de droite en premier?, est-ce que le premier prédicat est ré-utilisé?
    Il va essayer d'unifier [A|X] et [a,b,c], il y arrive en substituant a à A et donc X sera unifié avec [b,c], il essayer aussi d'unifier [A,A|Y] avec [a,a,b,d,c,c] il y a arrive en substituant a à A ; les deux substitutions ne se contredisent pas on continue ;
    mais là il y a un problème en essayant d'unifier [A,A|Y] avec [b,d,c,c] aucun A ne correspond. On passe à la suite.

    Il n'y a rien d'autre à essayer, on y arrive pas : réponse false.

  5. A voir en vidéo sur Futura
  6. #5
    MANTA..

    Re : Prolog

    MERCIIIIII c'est éxactement ce que je voulais savoir, effectivement dans mon résonnement je n'utilisais pas de substitution, ca devait être pour ca que javais du mal a comprendre. MERCII BEAUCOUP j'ai compris maintenant

Discussions similaires

  1. Déduction et validation : Prolog ou ML ?
    Par inviteab8f3a27 dans le forum Epistémologie et Logique (archives)
    Réponses: 0
    Dernier message: 25/08/2010, 06h26