2010-11-04 5 views
5

Przyjmijmy, mam następujące zasady:Dlaczego SWI-Prolog ujednolica cytowany i niecytowany ciąg (bez spacji) do tej samej reguły?

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

I wtedy go uruchomić w następujący sposób:

?- ['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. 

Dlaczego SWI-Prolog ujednolicić zarówno test i 'test' do unify('test', 'this is a test').? Natknąłem się na to, odpowiadając na pytanie Prologa na temat SO. Chociaż byłem w stanie odpowiedzieć na pytanie danej osoby, nie mogłem wyjaśnić tego konkretnego zachowania i zastanawiałem się, czy ktokolwiek inny mógłby to zrobić.

Odpowiedz

5

Podczas atomy SWI Prologa może być oznaczony za pomocą pojedynczego cytaty np 'This is an atom', apostrofami nie są potrzebne jeśli parser SWI Prologa może zidentyfikować atom z ciągu znaków, zwykle za pomocą małej litery alfabetu znak, taki jak test. Jeśli sekwencja zawierała spacje (lub inne znaki), potrzebowalibyśmy pojedynczych cudzysłowów do prawidłowego oznaczenia atomu. Znaki alfanumeryczne i niektóre znaki interpunkcyjne, takie jak podkreślenie _, są w porządku, np. test5_6.

Jeśli sekwencja znaków bez pojedynczych cudzysłowów miała zaczynać się od czegokolwiek innego, na przykład numeru 6k, parser potraktuje go jako number; jeśli był to duży znak alfabetyczny, taki jak Test, parser potraktuje go jako zmienną.

+0

Ach, to ten SWI-Prolog specyficzne zachowanie? –

+0

@Vivin Paliath: Być może, przynajmniej z SWI-PROLOG, chociaż wydaje się to typowe dla innych wdrożeń PROLOGa, które również widziałem. Niemniej jednak, tak, to jest coś, co zrobi w szczególności parser SWI-PROLOG, może tylko po to, by uchronić cię przed pojedynczym cytowaniem wszystkich twoich atomów :-) – sharky

4

Nie jest to zachowanie specyficzne dla SWI - jest wymagane przez standard. Istnieje prosty sposób, aby to zobaczyć. Możesz użyć tego również dla dowolnego innego terminu, którego składnia nie jest oczywista. Albo typ na Toplevel:

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

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

Odpowiedź jest zawsze ważny tekst Prolog - to specyficzne SWI ale także do wielu innych systemów, takich jak Prolog YAP, GNU, B, IF, SICStus.

Innym sposobem, aby zobaczyć ten jest użycie 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

Bardzo pouczające. Dzięki! –

Powiązane problemy