Programmation avec SWI-Prolog

Résolu/Fermé
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 - 9 déc. 2013 à 20:59
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 11 déc. 2013 à 23:52
Bonjour,

Je cherche a identifier le minimum d'une liste dans le langage prolog voila j'ai essai avec cette fonction récursive (min([_],_).
min([X,Y|Q],X):-X<Y min([X|Q],X).) et sa ne marche pas!
s'il vous play aidez mois ,merci d'avence pour votre répence

5 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
9 déc. 2013 à 23:10
Déjà tu ne devrais pas utiliser "min", il me semble que cela existe déjà en Prolog.
Ensuite il ne faut pas réfléchir en terme de fonction, ni de récursivité, Prolog est un langage logique, il faut donc réfléchir en terme de prédicat et de règle.

Je ne vais pas installer SWI juste pour tester la syntaxe mais en gros :

// Prédicat : M est toujours le minimum d'une liste vide.
minimum(M,[]).

// Règle : si M est inférieur à X et M est le minimum de la liste L.
// Alors M est le minimum de la liste qui commence par X et se poursuit par L.
minimum(M,[X|L]) :- M<X, minimum(M,L).
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
10 déc. 2013 à 23:19
Bonjour ,
Merci pour votre rèpence ,mais sa ne veut pas marché car le M n'est pas une variable connue c'est a dire quand compare la tète de la liste a un M qui n'est pas dans L et mois c'est ça qui me pose problème .comment comparer la tète de la liste aux autres éléments de la liste toute en avancent d'un pas j'ai essai avec se code mais aucun rèsultat (minimum(_,[_]).
minimum(X,[X,Y|L]) :-Y=<X ,X is Y, minimum(X,[L]).)
manuéllement il marche mais pas dans SWI.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 déc. 2013 à 00:34
Si tu fais
minimum(_,[_]).
ça signifie que n'importe quoi est le minimum d'une liste avec n'importe quoi dedans... Par exemple
minimum(5,[3]).
vaut true, il y a un problème...
Alors mettre un _ n'est pas une mauvaise idée, on pourrait faire
minimum(_,[]).
c'est à dire que n'importe quoi est le minimum d'une liste vide. Cependant
minimum(M,[M]).
est un peu mieux, car il indique que M appartient à la liste (ce qui manquait dans ma proposition d'hier).

minimum(X,[X,Y|L]) :-Y=<X ,X is Y, minimum(X,[L]).
je ne comprends pas ce que tu essayes de faire ici. En particulier avec ta liste
[X,Y|L]
, pourquoi avoir fait
Y<=X
et
X is Y
en même temps ?
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
11 déc. 2013 à 23:09
Bonsoir ,
Merci pour votre rèpence .
1)minimum(X,[X,Y|L]) signifie que je doit prendre car je ne peut pas prendre n'importe quel élément pour débuter la comparésent .
2)J'ai prie Y=<X pour comparer entre les 2 premier élément de la liste .
3)X is Y ,Si il trouve que Y est plus petit que X alors X prend la valeur de Y donc il va comparer le plus petit élément au reste des èlèments de la liste ,pour avencer dans la liste.
Et encord merci.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 déc. 2013 à 23:18
Au risque de me répéter, là ce que tu essayes de faire (avec ton X is Y) c'est de modifier les valeurs de tes arguments comme un programme impératif.
L'esprit du prologue est de lui donner les règles logiques suffisantes pour couvrir tous les cas, à lui ensuite d'inférer pour trouver le résultat.
Mais ce n'est pas à toi de manipuler les valeurs dans la liste.

Quand tu fais minimum(M,L). ça veut dire que M est le plus petit élément de la liste L. Il ne s'agit donc pas de comparer les éléments dans la liste (X et Y), mais de comparer les paramètres donnés (L) avec le résultat attendu (M).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
11 déc. 2013 à 23:32
Mais je cherche a éxtraire le minimum d'une liste donné ,mais pas de vérifié si le M est le min
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 déc. 2013 à 23:52
C'est Prolog qui va te calculer tout seul à partir des règles logiques que tu lui donnes.

Exemple plus simple :

"tom est le chef de paul qui est le chef d'henry qui est le chef de lionel"
chef(tom,paul).
chef(paul,henry).
chef(henry,lionel).

Si maintenant tu interroges Prolog il va te calculer tout seul les résultats, sans avoir à lui indiquer la méthode qu'il faut pour obtenir le résultat.

"Qui est le chef de lionel ?"
?- chef(X,lionel).
X = henry.

Maintenant avec une règle :

"X est le chef de Z si il existe Y tel que X est le chef de Y et Y est le chef Z"
chef(X,Z) :- chef(X,Y), chef(Y,Z).
"Qui a tom pour chef ?"
?- chef(tom,X).
X = paul ;
X = henry ;
X = lionel.

Prolog fonctionne toujours de cette manière, dans ton cas il faut donc définir les prédicats et règles qui permettent de dire "quand est-ce qu'il est vrai que M est le minimum de L"

Le but étant d'arriver à faire une interrogation de la sorte :
?- minimum(X,[4,2,7]).
X = 2.

Mais j'insiste sur le fait que ce n'est pas à toi de décrire comment arriver au résultat. Ce qu'il faut c'est "uniquement" fournir les règles logiques suffisantes pour parvenir à inférer tous les cas..
0