2009-11-17 10 views
2

J'essaye d'écrire une fonction qui va tester pour voir si le mot hello est contenu dans une liste. Si elle est contenue, je ne veux pas qu'elle dise "vrai", je veux qu'elle dise: "oui, le mot bonjour est contenu ici", des idées?Instructions conditionnelles SWI-Prolog

Voici mon code:

contains_hello([hello|_]). 
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail). 

Répondre

3

Ce n'est pas testé, mais essayer:

contains_hello([hello|_]) :- 
    write('yes, the word hello is contained here'), 
    nl. 
contains_hello([Head|Tail]) :- Head \= hello, contains_hello(Tail). 
+0

Fonctionne parfaitement - merci! – rb58

+0

Les deux solutions imprime oui, le mot salut est contenu ici vrai. –

4

Il est clair votre forme de code que vous voulez que le message à imprimer une fois. Actuellement vous résolvez ceci en ajoutant Head \= hello à la deuxième clause. Ce n'est pas ce que l'on résout habituellement dans Prolog. Notez que votre deuxième clause exclut précisément cette situation qui correspond à la première clause. Donc, il est beaucoup plus pratique de couper dans la première clause. Cela arrête le retour en arrière. Par exemple, si la première clause correspond, la deuxième clause ne sera pas prise en compte.

Une coupure est signifiée par le point d'exclamation (!). Ainsi:

contains_hello([hello|_]) :- 
    write('yes, the word hello is contained here'), nl, !. 

contains_hello([_|T]) :- contains_hello(T).