2009-11-21 9 views
7

J'ai lu à ce sujet dans un livre mais il n'a pas été expliqué du tout. Je ne l'ai jamais vu dans un programme. Fait partie de la syntaxe Prolog? C'est pour quoi? L'utilisez-vous?Quel est l'opérateur -> dans Prolog et comment puis-je l'utiliser?

Merci

+0

SOMME -> O1 + O2 ou quelque chose ... –

+2

C'est -> (notez les deux caractères), voir le Manuel SWI: http://www.swi-prolog.org/pldoc/doc_for?object=section%282 % 2c% 20% 274.12% 27% 2c% 20swi% 28% 27% 2fdoc% 2fManual% 2fDCG.html% 27% 29% 29 – starblue

Répondre

7

Il représente implication. Le côté droit n'est exécuté que si le côté gauche est vrai. Ainsi, si vous avez ce code,

implication(X) :- 
    (X = a -> 
    write('Argument a received.'), nl 
    ; X = b -> 
    write('Argument b received.'), nl 
    ; 
    write('Received unknown argument.'), nl 
). 

Ensuite, il va écrire des choses différentes selon ce raisonnement: (. link to documentation)

?- implication(a). 
Argument a received. 
true. 

?- implication(b). 
Argument b received. 
true. 

?- implication(c). 
Received unknown argument. 
true. 

+0

Attendez, si c'est une implication, alors logique 'false -> false' devrait donner' true ', quand ce n'est pas le cas. Qu'est-ce que c'est? –

2

Il est une version locale de la coupe, voir par exemple le section on control predicated dans le manuel SWI.

Il est principalement utilisé pour implémenter if-then-else par (condition -> true-branch, false-branch). Une fois la condition réussie, il n'y a plus de retour en arrière de la branche vraie dans la condition ou dans la branche false, mais le retour en arrière de if-then-else est toujours possible. Par conséquent, il est appelé coupe locale ou coupe douce.

+0

Soft cut est disponible en SWI via "* ->", pas "->"! – mat

0

Il est possible d'éviter de l'utiliser en écrivant quelque chose de plus verbeux. Si je réécris Stephan's prédicat:

implication(X) :- 
    (
    X = a, 
    write('Argument a received.'), nl 
    ; 
    X = b, 
    write('Argument b received.'), nl 
    ; 
    X \= a, 
    X \= b, 
    write('Received unknown argument.'), nl 
). 

(. Oui, je ne pense pas qu'il y ait un problème avec l'utilisation, mais mon patron était paranoïaque à ce sujet pour une raison quelconque, nous avons donc utilisé toujours l'approche ci-dessus)

Avec l'une ou l'autre version, vous devez veiller à couvrir tous les cas que vous avez l'intention de couvrir, en particulier si vous avez plusieurs branches. ETA: Je ne suis pas sûr que ce soit complètement équivalent à celui de Stephan, à cause du retour arrière si vous avez implication(X). Mais je n'ai pas d'interprète Prolog pour vérifier. Je l'ai lu pourrait être utilisé pour écrire des parseurs

+0

Hmm. Je ne suis pas tellement dans Prolog, mais cela semble violer le principe DRY. Je ne sais pas si ça vaut le coup! Je veux dire, surtout si les conditions préalables deviennent légèrement plus complexes, cela peut devenir salissant. Comme pour backtracking: pour cette version (SWI-), prolog ne retourne pas immédiatement à l'invite sur 'implication (a) 'et' implication (b) ', donc en effet, un retour arrière sera tenté. – Stephan202

+0

Ouais, je ne suis définitivement pas en train de dire que c'est une alternative supérieure, juste que c'est une alternative. :) – pfctdayelise