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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top