Warum SWI-Prolog notierten und nicht notierten Zeichenfolge (ohne Leerzeichen) in die gleiche Regel vereinen?

StackOverflow https://stackoverflow.com/questions/4100943

Frage

Angenommen ich folgende Regeln:

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

Und dann habe ich es laufen wie folgt:

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

Warum SWI-Prolog sowohl test und 'test' zu unify('test', 'this is a test'). vereinigen? Also kam ich über, während ein Prolog Frage auf SO beantworten. Während ich in der Lage war die Person, die Frage zu beantworten, könnte ich dieses bestimmte Verhalten nicht erklären, und ich frage mich, ob jemand anderes könnte.

War es hilfreich?

Lösung

Während Atome in SWI-Prolog können mit einfachen Anführungszeichen bezeichnet werden, zB 'This is an atom', einfache Anführungszeichen sind nicht erforderlich , wenn der SWI-Prolog-Parser ein Atom aus einer Folge von Zeichen identifizieren kann, in der Regel beginnen mit einem Kleinbuchstaben, wie test. Wenn die Sequenz Leerzeichen enthalten (oder einige andere Zeichen), dann würden Sie die einfachen Anführungszeichen benötigen ein Atom richtig zu bezeichnen. Alphanumerische Zeichen und bestimmte Satzzeichen wie Strich _ sind in Ordnung, zum Beispiel test5_6.

Wenn die Zeichenfolge ohne einfache Anführungszeichen waren mit etwas beginnen sonst, wie eine Reihe 6k, der Parser es als number behandeln; wenn es ein Groß alphabetisches Zeichen wie Test ist, wird der Parser es als eine Variable behandeln.

Andere Tipps

Dies ist nicht SWI bestimmte Verhalten - es von der Norm gefordert wird. Es gibt einen einfachen Weg, dies zu sehen. Sie können damit auch für ein Begriff, deren Syntax nicht evident. Jede Art an der Toplevel:

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

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

Die Antwort ist immer gültig Prolog Text - dies ist spezifisch für SWI aber auch zu vielen anderen Prolog-Systemen wie YAP, GNU, B, IF, SICStus.

Eine andere Möglichkeit, dies zu sehen ist write_canonical / 1 zu verwenden:

?- 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)),[]))))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top