2010-11-04 7 views
5

Supposons que je les règles suivantes:Pourquoi SWI-Prolog unifie une chaîne entre guillemets et sans guillemets (sans espaces) à la même règle?

unify('test', 'this is a test'). 
run :- write('Enter something: '), 
     read(X), 
     unify(X, Y), 
     write('The answer is '), write(Y). 

Et puis je le lance comme suit:

?- ['unify.pl']. 
% unify.pl compiled 0.00 sec, -48 bytes 
true. 

?- run. 
Enter something: test. 
The answer is this is a test 
true. 

?- run. 
Enter something: 'test'. 
The answer is this is a test 
true. 

Pourquoi SWI-Prolog unifie les deux test et 'test'-unify('test', 'this is a test').? Je suis tombé sur ceci tout en répondant à une question Prolog sur SO. Pendant que j'étais capable de répondre à la question de la personne, je ne pouvais pas expliquer ce comportement particulier, et je me demandais si quelqu'un d'autre pouvait le faire.

Répondre

5

Bien que les atomes dans SWI-Prolog peuvent être désignées à l'aide des guillemets simples, par exemple, 'This is an atom', guillemets simples sont pas nécessaires lorsque l'analyseur SWI-Prolog peut identifier un atome à partir d'une séquence de caractères, en commençant habituellement par une lettre minuscule caractère, tel que test. Si la séquence contenait des espaces (ou d'autres caractères), vous auriez besoin des guillemets simples pour indiquer un atome correctement. Les caractères alphanumériques et certains caractères de ponctuation comme le trait de soulignement _ sont corrects, par exemple, test5_6. Si la séquence de caractères sans guillemets simples devait commencer par autre chose, comme un nombre 6k, l'analyseur le traitera comme number; s'il s'agissait d'un caractère alphabétique majuscule tel que Test, l'analyseur le traitera comme une variable.

+0

Ah, ce comportement est spécifique à SWI-Prolog? –

+0

@Vivin Paliath: Peut-être, au moins avec SWI-PROLOG, bien que cela semble typique des autres implémentations PROLOG que j'ai vues. Mais néanmoins, oui, c'est quelque chose que l'analyseur SWI-PROLOG fera en particulier, peut-être seulement pour vous éviter de devoir citer tous vos atomes :-) – sharky

4

Ce comportement n'est pas spécifique à SWI - il est requis par la norme. Il existe un moyen simple de voir cela. Vous pouvez aussi utiliser ceci pour tout autre terme dont la syntaxe n'est pas évidente. Les deux types au premier niveau:

 
?- X = 'test'. 
X = test. 

?- X = 'this is a test'. 
X = 'this is a test'. 

La réponse est toujours valide le texte Prolog - ceci est spécifique à SWI mais aussi à beaucoup d'autres systèmes Prolog comme YAP, GNU, B, IF, SICStus.

Une autre façon de voir est d'utiliser write_canonical/1:

 
?- write_canonical('this is a test'). 
'this is a test' 
true. 

?- write_canonical([a,b,(c,d),{e,f}]). 
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[])))) 
+0

Très instructif. Merci! –

Questions connexes