2014-12-29 3 views
14

Was ist der kompakteste und kanonischste Weg in ISO Prolog, um auf eine Liste von verschiedenen Variablen zu testen? Nennen wir dieses meta-logische Prädikat is_varset/1.Testen Sie den Begriff als Liste verschiedener Variablen

So sollte es gelingen, wenn sein Argument eine Liste von Variablen ist, die alle unterschiedlich sind. Beachten Sie, dass eine Liste immer einen [] an ihrem Ende enthält. Wenn eine Variable am Ende ist, nennen wir dies eine Teilliste (die also keine Liste ist). Und wenn ein nicht variabler Term als Suffix auftritt, das weder [] noch eine Variable ist, dann ist das weder eine unvollständige Liste noch eine Liste.

Ein bemerkenswerter Spezialfall eines Begriffs, der weder eine unvollständige Liste noch eine Liste ist, sind unendliche Listen. Sie enthalten mindestens zwei Suffixe, die identisch sind, tatsächlich besitzen sie dann unendlich solche Suffixe. Unbegrenzte Listen sind außerhalb des Bereichs des Standards —. Alle Versuche, sie zu erstellen, führen zu einer STO-Vereinheitlichung, deren Ergebnis undefiniert ist. Einige Systeme unterstützen sie jedoch, daher sollte is_varset/1 im Idealfall für diese unendlichen Listen endlich fehlschlagen.

?- is_varset([A|nonlist]). 
false. 

?- is_varset([A,B]), is_varset([B,A]). 
true. 

?- is_varset([A,B,A]). 
false. 

?- is_varset([A,f(B)]). 
false. 

?- is_varset([A|_]). 
false. 

?- L = [_|L], is_varset(L). % may loop, should rather terminate 
false. 

Hier ist ein overview of the built-ins in ISO/IEC 13211-1: 1995 einschließlich Cor.2: 2012.

Antwort

8

diese einfache Definition in SWI-Prolog scheint die Anforderungen

is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs. 
+2

Sieht gut zu erreichen! Könnten Sie begründen, warum Sie kein '=' anstelle von '==' setzen? – false

+2

dieser Testfall '? - is_varset ([A, f (B)]).' Es antwortet 'B = f (B) .' wenn (=)/2. Zugegeben, ich habe (==)/2 an erster Stelle nur basierend auf Intuition verwendet und erneut nach Ihrem Kommentar getestet ... – CapelliC

+2

Und was, wenn 'unify_with_occurs_check' anstelle von' == 'verwendet wird? – false

Verwandte Themen