2016-01-09 2 views
3

Quelqu'un pourrait-il m'expliquer ce que fait "!" faire à Prolog? Je ne comprends pas. Ici, j'ai un code qui compte combien de sous-listes d'une liste hétérogène ont un aspect de montagne.Qu'est-ce que "!" dans Prolog

nrSubliste([], 0). 
nrSubliste([H|T], R):- 
    is_list(H), 
    munteMain(H),!, 
    nrSubliste(T, R1), 
    R is R1 + 1. 
nrSubliste([_|T], R):- 
    nrSubliste(T, R). 

munteMain vérifie si une liste linéaire a un aspect de montagne.

+1

Consultez également la [réponse canonique] (http://stackoverflow.com/a/14556019/1613573) quand utiliser ' !/0' dans Prolog. – mat

Répondre

1

Exclamation point ! indique Cut en Prolog, un but spécial qui réussit toujours, et bloque retours en arrière pour toutes les branches au-dessus il qui peuvent avoir des solutions de rechange.

Dans votre cas, cela signifie qu'une fois qu'une solution à munteMain/1 a été trouvée, le programme ne retournera jamais en arrière et cherchera une solution alternative. Plus précisément, Prolog ne considérera jamais la troisième clause de votre règle nrSubliste/2, c'est-à-dire celle qui ignore la tête de liste avec _, si H dans la deuxième clause est telle que munteMain(H) réussit.

Notez que l'utilisation de ! rend votre code plus difficile à lire et à maintenir, car la logique de la troisième clause dépend de la logique de la deuxième clause. Vous pouvez réécrire votre programme sans coupe à l'aide du pas prouvableoperator \+:

nrSubliste([H|T], R):- 
    is_list(H), 
    munteMain(H), 
    nrSubliste(T, R1), 
    R is R1 + 1. 

nrSubliste([H|T], R):- 
    is_list(H), 
    \+ munteMain(H), 
    nrSubliste(T, R). 
+0

Ok, je pense que je l'ai compris et je vous remercie beaucoup pour l'alternative d'utiliser l'opérateur \ +. – LauraW