2 votes

Opérateur de coupe Prolog dans le premier prédicat

J'ai la base suivante en Prolog :

holiday(friday,may1).
weather(friday,fair).
weather(saturday,fair).
weather(sunday,fair).
weekend(saturday).
weekend(sunday).

picnic(Day) :- !,weather(Day,fair), weekend(Day).
picnic(Day) :- holiday(Day,may1).

Quand je cours picnic(When). J'obtiens la trace suivante :

[trace]  ?- picnic(When).
   Call: (6) picnic(_G716) ? creep
   Call: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(friday, fair) ? creep
   Call: (7) weekend(friday) ? creep
   Fail: (7) weekend(friday) ? creep
   Redo: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(saturday, fair) ? creep
   Call: (7) weekend(saturday) ? creep
   Exit: (7) weekend(saturday) ? creep
   Exit: (6) picnic(saturday) ? creep
When = saturday ;
   Redo: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(sunday, fair) ? creep
   Call: (7) weekend(sunday) ? creep
   Exit: (7) weekend(sunday) ? creep
   Exit: (6) picnic(sunday) ? creep
When = sunday.

Mon doute est le suivant : l'opérateur cut, tel que je le connais, devrait arrêter de chercher des alternatives lorsque les prédicats à gauche de l'opérateur cut ont été supprimés. ! sont vraies. Quelle est la signification du signal en première position ? Pourquoi l'interprète continue-t-il à chercher une autre valeur qui peut rendre les autres prédicats vrais ?

3voto

CapelliC Points 30055

L'effet de cette coupe est que votre deuxième règle de picnic/1 sera totalement ignorée. Elle n'aura jamais l'occasion de se déclencher pendant la durée de vie de votre programme.

Mais le retour en arrière est toujours à l'œuvre parmi les alternatives disponibles (buts à droite de la coupe), et vous pouvez clairement les observer dans votre trace.

0voto

Profiterole Points 111

Art of Prolog, part 11, cuts and negation "Opérationnellement, la coupe est traitée comme suit. Le but réussit et engage Prolog à tous les choix effectués depuis que le but parent a été unifié avec la tête de la clause dans laquelle la coupure se produit." Donc, une fois que votre but supérieur est unifié avec la tête de votre premier picnic/1, il ne peut pas être unifié alternativement avec la tête de votre deuxième picnic/1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X