2016-09-05 1 views

Antwort

1

Sie haben vollkommen Recht, dass dies "normalerweise" nicht der Fall sein kann.

jedoch für Effizienzgründen, Prolog-Implementierungen auslassen typischerweise die überprüfen auftritt und daher etwas unerwartete Ergebnisse in solchen Fällen ergeben können, so dass für zyklische   Begriffe durch sogenannte rational   Baum Vereinigung.

Sehen Sie einen einfachen Fall:

 
?- X = f(X). 
X = f(X). 

Sie können das Prädikat ISO verwenden unify_with_occurs_check/2 syntaktische Einheit auszuführen, wie Sie wahrscheinlich wissen es:

 
?- unify_with_occurs_check(X, f(X)). 
false. 

Insbesondere in SWI-Prolog, da das ist Flag occurs_check, die Sie auf true setzen können, um die Vorkommensprüfung für alle Unifications zu ermöglichen. Dies ist ein sehr leistungsfähiges und wertvolles Feature:

 
?- set_prolog_flag(occurs_check, true). 
true. 

?- X = f(X). 
false. 

Sie sogar die Fahne error festlegen können Fälle zu fangen, wo Ihr Programm ist STO, unterliegt auftritt Kontrolle:

 
?- set_prolog_flag(occurs_check, error). 
true. 

?- X = f(X). 
ERROR: =/2: Cannot unify _G937 with f(_G937): would create an infinite tree