Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Prolog
Prolog Forum d'entraide sur la programmation en langage Prolog. Avant de poster : Cours Prolog
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/06/2012, 17h55   #1
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Par défaut Problème idiot de "redo" supplémentaire

Bonjour,

Je me remets à Prolog après une longue période d'abstinence. Je suis sur un petit exercice qui consiste à écrire un prédicat "greater_than" avec une notation d'entiers de type "successeur de" :
Code :
1
2
3
4
5
6
greater_than(0, 0).
greater_than(succ(A), 0) :-
	greater_than(A, 0).
greater_than(succ(A), succ(B)) :-
	greater_than(A, B).
Ma question : pourquoi est-ce qu'en l'état, la requête
Code :
greater_than(succ(succ(succ(0))),succ(0))
fait faire un "Redo" à SWI-prolog sur la deuxième entrée du prédicat ? Pour l'éviter je suis obligé de rajouter une coupure, que je souhaite éviter (parce que je suis convaincu qu'elle n'est pas nécessaire).

Trace d'exécution :
Citation:
[trace] ?- greater_than(succ(succ(succ(0))),succ(0)).
Call: (7) greater_than(succ(succ(succ(0))), succ(0)) ? creep
Call: (8) greater_than(succ(succ(0)), 0) ? creep
Call: (9) greater_than(succ(0), 0) ? creep
Call: (10) greater_than(0, 0) ? creep
Exit: (10) greater_than(0, 0) ? creep
Exit: (9) greater_than(succ(0), 0) ? creep
Exit: (8) greater_than(succ(succ(0)), 0) ? creep
Exit: (7) greater_than(succ(succ(succ(0))), succ(0)) ? creep
true ;
Redo: (9) greater_than(succ(0), 0) ? creep
Fail: (9) greater_than(succ(0), 0) ? creep
Redo: (8) greater_than(succ(succ(0)), 0) ? creep
Fail: (8) greater_than(succ(succ(0)), 0) ? creep
Fail: (7) greater_than(succ(succ(succ(0))), succ(0)) ? creep
false.
Il y a sans doute quelque chose qui me crève les yeux... Merci de votre aide !
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2012, 22h24   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Il me semble que c'est
Code :
greater_than(succ(_), 0).
non ?
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 10h08   #3
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Citation:
Envoyé par Trap D Voir le message
Il me semble que c'est
Code :
greater_than(succ(_), 0).
non ?
Disons que j'ai choisi de faire un supérieur ou égal, parce que justement si je fais ça, je vais avoir des réponses multiples en cas de succès, et je cherche précisément à éviter ça.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 16h24   #4
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Citation:
Envoyé par Eusebius Voir le message
Disons que j'ai choisi de faire un supérieur ou égal, parce que justement si je fais ça, je vais avoir des réponses multiples en cas de succès, et je cherche précisément à éviter ça.
Je ne comprends pas ce que tu veux dire
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 16h53   #5
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Citation:
Envoyé par Trap D Voir le message
Je ne comprends pas ce que tu veux dire
C'est normal, j'ai plus ou moins dit une bêtise : avec le code que j'avais en tête, faire une terminaison comme tu le propose donnait plusieurs solutions "true". Mais ce n'est pas obligé, donc oublie ma remarque.

Si je fais ce que tu suggères (pour coder un supérieur strict, donc) :
Code :
1
2
3
greater_than(succ(_), 0).
greater_than(succ(A), succ(B)) :-
	greater_than(A, B).
J'ai toujours un "redo" que je ne comprends pas :
Citation:
[trace] ?- greater_than(succ(succ(succ(0))),succ(0)).
Call: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
Call: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
true ;
Redo: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
false.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 15h20   #6
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Oui, en fait ce que je proposais était :
Code :
1
2
3
4
5
greater_than(0, 0).
greater_than(succ(_A), 0).

greater_than(succ(A), succ(B)) :-
	greater_than(A, B).
qui est un greater_than. Mais ça ne change rien au redo
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2012, 10h43   #7
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Je n'observe plus ce comportement dans ma version actuelle de SWI. Ça devait être un souci interne à SWI-prolog...
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 00h27   #8
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
C'est laquelle, la dernière version stable ou une de développement (6.1.13 pour moi) ?
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 07h16   #9
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Citation:
Envoyé par Trap D Voir le message
C'est laquelle, la dernière version stable ou une de développement (6.1.13 pour moi) ?
Je suis sur la dernière stable (5.10 et des brouettes), mais apparemment ce "problème" (en fait un choix d'optimisation dans l'indexation des clauses) est "résolu" depuis au moins 5.4.4.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 09h35   #10
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
La dernière version stable est la 6.2.0 (depuis quelques jours je crois )
__________________
"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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 09h46   #11
Eusebius
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 296
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 296
Points : 3 268
Points : 3 268
Citation:
Envoyé par Trap D Voir le message
La dernière version stable est la 6.2.0 (depuis quelques jours je crois )
True. 5.10.4 est celle qui est dans mon repository Ubuntu.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h58.


 
 
 
 
Partenaires

Hébergement Web