2012-04-14 7 views
4

ich durch einige ECLIPSE Dokumentation würde und diese gefunden:ECLIPSE Prolog - Unerwartetes Verhalten von 'nonvar/1'

`nonvar/1` : Fails if Term is not instantiated 

ich versucht das zu tun:

1. Query: nonvar(X). Result: No (AS EXPECTED) 
2. Query: X=5, nonvar(X). Result: Yes (AS EXPECTED) 
3. Query: X=5, nonvar(f(X)). Result: Yes, X=5. (AS EXPECTED) 

Nun ist diese Abfrage-Ergebnis verwirrt mich :

4. Query: nonvar(f(X)). Result: Yes, X=X. 

Abfragen 1,2,3 funktionieren wie erwartet. Für mich ist das Ergebnis von 4 seltsam. Gemäß der Dokumentation von nonvar/1 in Eclipse kann das Argument ANY PROLOG TERM sein (also ist f (X) in Ordnung) und nonvar testet, ob das Argument INSTANTIATED ist oder nicht.

Im Fall von 4 wird es nicht instanziiert, also sollte es NEIN sein und nicht JA (X = X). Bitte korrigieren Sie mich, wenn mein Verständnis falsch ist, oder handelt es sich um ein Dokumentationsproblem in ECLiPSe Prolog? Ich benutze die neueste Version.

Danke!

+0

@mescalinum: Dies ist in keiner Weise spezifisch an Eclipse-Prolog – false

Antwort

5

In Ihrer Anfrage 4, f(X)enthält die Nicht-instanziiert Variable X aber es nicht selbst eine instanziierte Variable.

SWI-Prolog Hilfe ist vielleicht etwas klarer über die Bedeutung von nonvar:

nonvar(Term): Wahr, wenn Term zur Zeit keine freie Variable ist.

können Sie prüfen, ob ein Begriff freie Variablen mit ground/1 enthält:

?- X = 5, ground(f(X)). 
X = 5. 

?- ground(f(X)). 
false. 
+0

@ larsmans- Bitte korrigiert mich, wenn ich falsch bin - Isnt eine Struktur wie f (X, Y) auch ein Begriff, der für sich eine freie Variable ist? – kallakafar

+0

Also, mit var und non-var, sollten wir nicht für zusammengesetzte Begriffe testen, ist das die Bedeutung? – kallakafar

+3

@kallakafar: ein zusammengesetzter Begriff ist nie eine Variable. Es kann Variablen enthalten, aber es ist nicht eins. –

Verwandte Themen