Che cosa significa [A | B | c] valutare al SWI-Prolog?
-
24-10-2019 - |
Domanda
L'operatore pipe dei rendimenti prologo uno o più capi atomiche e un elenco di coda.
?- [a,b,c] = [a,b|[c]].
true.
tubi multipli di parentesi in una singola partita può essere fatto simile a questo:
?- [a,b,c] = [a|[b|[c]]].
true.
Che cosa fa l'infer dichiarazione [a|b|c]
circa un, B e C?
Modifica
Finora, tutto quello che posso dedurre è:
?- [a,b,c] = [a|b|c].
false.
Sono più interessato a qualsiasi tecniche per trovare la risposta, piuttosto che rispondere a questa domanda borderline inutile.
EDIT2
Io non sono chiaramente troppo familiarità con prologo, un compito semplice risposto alla mia domanda ...
?- R = [a|b|c].
R = [a| (b'|'c)].
Che cosa sta succedendo con (b'|'c)
?
Soluzione
Dato che io sono il tuo docente Io, ecco la mia risposta.
(Oh, e posso confermare che questo non è lavoro, è legato al esame di pratica).
La sintassi di [a|b|c]
in realtà non sembra essere standard Prolog, e alcune implementazioni interpretare in modo diverso. (Se l'avessi saputo forse non l'ho usato.)
Alcuni interpretano come [a|[b|c]]
. (Come ho inteso.)
Ma con SWI Prolog (e probabilmente altri):
?- [a|b|c] = [a|[b|c]].
false.
Il (b '|' c)
è in realtà costruito utilizzando '|'
piuttosto che '.'
come un elenco sarebbe. Così, la seconda |
non viene interpretata come parte della costruzione di una lista a tutti.
A conferma di ciò, il seguente esito positivo:
?- X=(b|c), [a|b|c] = [a|X]. X = (b'|'c) .
Il '|'
qui sembra essere un altro operatore binario a condizioni proprio come '.'
.
Invece di [a|b|c]
lo standard in Prolog è quello di utilizzare [a,b|c]
.
(ho deciso solo per uso [a|b|c]
nella programmazione paradigmi perché si riferisce più direttamente al a::b::c
notazione da F #, e abbiamo visto solo un piccolo assaggio di Prolog. In futuro mi immagino io relaziono [a|[b|c]]
e poi dare [a,b|c]
come un'abbreviazione.)
Altri suggerimenti
Non è una dichiarazione, si tratta di un termine, e non implica nulla circa a
, b
o c
. E 'appena costruisce una lista improprio.
Per elaborare: La sintassi [|]
è in realtà zucchero sintattico per l'operatore .()
. Le liste sono costruiti internamente tramite '.'(a,[])
, ma dal momento che diventa estremamente noioso digitare subito, si è permesso di scrivere [a]
invece. Così l'operatore .
dovrebbe prendere una cosa e una lista e poi costrutti una lista più lunga, ma dal momento che non v'è alcuna digitazione, nessuno ti impedisce di applicarlo a due atomi, o qualsiasi altra coppia di cose. Il risultato è una struttura sulla quale alcune operazioni di lista successo e altri non riescono. Questo a volte è utile (si pensi alberi binari), ma non così comune come le liste, quindi non v'è alcuna sintassi speciale di lettura per esso.
(Lo stesso accade con l'operatore cons
in Lisp;. Se google "lista improprio" siete responsabili per ottenere molti più risultati su Lisp, ma il principio è esattamente lo stesso)
In ISO-Prolog, [a|b|c]
è sintassi non valida. E nel frattempo anche a SWI. Sembra che hai utilizzato una versione precedente. Alcuni sistemi Prolog dato questo termine qualche interpretazione. Ahimè, tutti differivano in modo molto preciso come hanno interpretato questo termine. Alcuni come [(a'|'b)|c]
o [a|(b'|'c)]
o [a|(b;c)]
... bene, lo si ottiene.
A questo proposito è l'utilizzo della barra come ('|')/2
operatore infisso.
ISO / IEC 13.211-1: 1995 / Cor.2: 2012 , tecnico Rettifica 2, pubblicato 2012-02-15 l'uso di barra |
come operatore infisso è ora definito con precisione. Prima di esso, |
doveva essere citato. Qui è il suo progetto .
Ora, '|'
può essere definito come un operatore infisso ma solo con una priorità sopra 1000. In questo modo tuttavia casi ambigui come [a|b|c]
rimangono sintatticamente valido, ma usi |
per DCGs e CHR sono valide.
Se volete imparare la sintassi da cercare fuori, la migliore è quella di utilizzare writeq/1
e write_canonical/1
.
Il sistema più conforme w.r.t sintassi ISO-Prolog è GNU Prolog.