Warum gilt die Ersetzung X = Y, Y = [Y]
bei dieser Abfrage [f(X)|Y] = [f(Y),X]
? Wie kann X
gleichzeitig Y
und [Y]
sein?Warum gilt diese Ersetzung in Prolog?
Antwort
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
- 1. Warum funktioniert diese String-Ersetzung/Verkettung nicht in Gradle?
- 2. Warum stimmt diese Vim RegEx Suche und Ersetzung nicht überein?
- 3. VIM: kann diese Ersetzung nicht vollständig verstehen
- 4. Was bedeuten diese im Prolog?
- 5. Closure Compiler gilt nicht @const auf diese
- 6. Warum wird diese Zeile im Prolog falsch zurückgegeben?
- 7. CSS-Datei Regel für diese Klasse gilt
- 8. Warum {} == {} ist falsch, aber {} + {} == {} + {} gilt
- 9. Warum gilt SharedPreferences.Editor.apply() nicht sofort?
- 10. Warum gilt RVO nicht in diesem Code
- 11. Warum gilt die Anweisung in sub global?
- 12. createHTMLNotification() Ersetzung
- 13. Warum funktioniert dieses Prolog-Prädikat?
- 14. Warum versagt diese Ersetzung von variadischen Vorlagenparametern? (Pack vor dem Fest Argumente)
- 15. Bedingte Ersetzung in vim
- 16. Warum schlägt die Ersetzung mit PATINDEX für bestimmte Sonderzeichen fehl?
- 17. CHAR_BIT Ersetzung
- 18. Warum gilt fill_parent nicht für Dialoge?
- 19. jQuery Ersetzung hängt Chrom
- 20. ^M vs \ n in vim Zeichenfolge Ersetzung
- 21. Wie diese beiden if-else-Anweisung in Prolog fusionieren
- 22. String-Ersetzung regex
- 23. Warum funktioniert diese Konvertierung nicht?
- 24. System.Data.Entity.Spatial Ersetzung in ASP.NET Core
- 25. Warum int & a=10; gilt in alten C++ - Compiler?
- 26. regex für String-Ersetzung
- 27. Abwicklungsliste in Prolog
- 28. Syntax-bewusste Substring-Ersetzung
- 29. VB - Ersetzung von Buchstaben
- 30. Ruby-String-Ersetzung