Che cosa significa in Prolog confrontare un predicato con una variabile non associata?Cosa fa il Prolog se si X = f (X)?
risposta
Il risultato dell'obiettivo X = f(X)
dipende dall'implementazione del Prolog. In alcuni sistemi, come ha sottolineato Carlo nella sua risposta, il risultato può essere controllato da un flag impostabile dall'utente. Il predicato di unificazione, (=)/2
, può essere implementato con o senza il cosiddetto controllo . Questo controllo verifica se una variabile in un operando si verifica in un sottotitolo nell'altro operando. Quando il predicato di unificazione implementa questo controllo, l'obiettivo X = f(X)
non riesce. Ma, per ragioni di prestazioni, il predicato di unificazione è spesso implementato senza questo controllo. Lo standard ISO Prolog specifica un predicato di unificazione alternativo, opportunamente chiamato unify_with_occurs_check/2
, che può essere utilizzato quando obiettivi come questo possono portare a problemi.
Al giorno d'oggi, diverse implementazioni supportano i termini ciclici, noto anche come termini razionali, che vengono creati da obiettivi come la X = f(X)
. Questi includono CxProlog, ECLiPSe, SICStus Prolog, SWI-Prolog e YAP. Si noti, tuttavia, che il livello di supporto per i termini razionali varia a seconda del sistema. Il supporto minimo sarà (1) per essere in grado di creare termini razionali (senza uno stack overflow!), (2) per essere in grado di unificare due termini razionali e (3) di essere in grado di stampare i binding di query che includono termini razionali in un modo non ambiguo. Con queste tre funzioni puoi ad es. attuare programmazione logica coinduttiva, che è utile per diverse classi di problemi.
In Prolog, (=)/2 non è un confronto, ma un'operazione fondamentale, denominata unification.
L'espressione mostrata nel titolo della domanda, se richiamata quando X è una variabile libera, creerà un termine ciclico. In SWI-Prolog
?- X=f(X),write(X).
@(S_1,[S_1=f(S_1)])
X = f(X).
termini ciclici sono problematiche da trattare, di solito vengono creati dagli errori di programmazione: il comportamento di SWI-Prolog (e altri) può essere controllato utilizzando un flag globale, vedere occurs_check.
- 1. Cosa fa var x = x || {};
- 2. Cosa fa se [ "x"! = X] fare in bash?
- 3. F # - cosa combacia ... con | :? X come x significa?
- 4. Cosa fa l'intestazione X-SourceFiles?
- 5. cosa fa x: Key = "{x: Type TextBox}" fare?
- 6. cosa fa la barra (/) in prolog?
- 7. Cosa fa x >>> 0?
- 8. Cosa fa la lista [x :: y]?
- 9. Cosa fa l'intestazione X-Backside-Transport?
- 10. Cosa diavolo fa std :: bind (x, y) do?
- 11. Cosa fa il predicato s() in Prolog?
- 12. Scrittura in stile pointfree f x = g x x
- 13. Cosa fa il flag -f in coda?
- 14. Cosa significa: chiave = lambda x: x [1]?
- 15. Come definire x ++ (dove x: int ref) in F #?
- 16. Il tipo di errore F # "X" non è compatibile con il tipo "X"
- 17. fa% x [] cattura tutto l'output?
- 18. grep -f su OS X produce segfault
- 19. Compressione `x se x il resto y` dichiarazione in Python
- 20. Come si fa un applicativo in F #?
- 21. Cosa fa (int) (unsigned char) (x) do in C?
- 22. Semplifica se (x) Alcuni (y) altro Nessuno?
- 23. Cosa significa x [x <2] = 0 in Python?
- 24. Tipo di f g x = g. gx
- 25. Trasforma la funzione spline 2d f (t) in f (x)
- 26. Cosa fa questo: git branch -f
- 27. Perché x = x non genera un errore, anche se x è definito
- 28. `X x = x = X();` legale C++?
- 29. riga, = trama (x, sin (x)) cosa significa virgola?
- 30. Far cadere del tutto X fa male?