A Mercury programozási nyelv

DCG-célok

Egy DCG-cél egy term, melynek a formája a következők közül valamelyik:

some Vars DCG-goal
Egy DCG egzisztenciális kvantifikáció. Vars változók listája. DCG-goal-nak érvényes DCG-célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, some Vars DCG_goal) =
some Vars transform(V_in, V_out, DCG_goal)

all Vars DCG-goal
Egy DCG univerzális kvantifikáció. Vars változók listája. DCG-goal-nak érvényes DCG-célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, all Vars DCG_goal) = all Vars transform(V_in, V_out, DCG_goal)
	

DCG-goal1, DCG-goal2
DCG szekvencia. Intuitívan ez annyit jelent, hogy "elemezd DCG-goal1-et, aztán DCG-goal2-t", vagy "hajtsd végre DCG-goal1-et, aztán DCG-goal2-t". (Vegyük észre, hogy az egyetlen mód, hogy ez a konstrukció valójában kikényszerítse a kívánt szekventációt, az az implicit DCG-argumentumot módjainak kihasználása.) DCG-goal1-nak és DCG-goal2-nek érvényes DCG-célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, (DCG-goal1, DCG-goal2)) = (transform(V_in, V_new, DCG_goal1), transform(V_new, V_out, DCG_goal2))
	
ahol V_new egy friss változó.
DCG-goal1 ; DCG-goal2
Diszjunkció. DCG-goal1 és DCG-goal2 érvényes célok. DCG-goal1 formája nem lehet DCG-goal1a -> DCG-goal1b. (Ha az lenne, akkor a cél egy if-then-else, nem diszjunkció.)

Szemantikája:

	  transform(V_in, V_out, (DCG_goal1 ; DCG_goal2)) = ( transform(V_in, V_out, DCG_goal1) ; transform(V_in, V_out, DCG_goal2) )
	

{ Goal }
Kapcsos zárójelek közötti szokványos cél. Goal-nak érvényes célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, { Goal }) = (Goal, V_out = V_in)
	
[Term, ...]
DCG input illesztés. Egyesíti a V_in implicit DCG input változót, aminek list(_) típusúnak kell lennie, egy olyan listával, melynek kezdeti elemei a megadott termek, és aminek a vége a V_out implicit DCG out változó. A termeknek érvényes adat-termeknek kell lenniük.

Szemantikája:

	  transform(V_in, V_out, [Term1, ...]) = (V_in = [Term, ... | V_Out])
	

[]
Null DCG cél (egy üres DCG input illesztés). Ekvivalens { true }-val.

Szemantikája:

	  transform(V_in, V_out, []) = (V_out = V_in)
	

not DCG-goal
\+ DCG-goal
DCG negáció. A két különböző szintaxisnak ugyanaz a szemantikája. Goal-nak érvényes célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, not DCG_goal) = (not transform(V_in, V_new, DCG_goal), V_out = V_in)
	
ahol V_new egy friss változó.
if CondGoal then ThenGoalelse ElseGoal
CondGoal -> ThenGoal; ElseGoal
DCG if-then-else. A két különböző szintaxis szemantikája megegyezik. CondGoal-nak, ThenGoal-nak és ElseGoal-nak érvényes DCG-célnak kell lennie.

Szemantikája:

	  transform(V_in, V_out, if CondGoal then ThenGoal else ElseGoal) =
if transform(V_in, V_cond, CondGoal) then
	    transform(V_cond, V_out, ThenGoal)
	  
else
	    transform(V_in, V_out, ElseGoal)
	  

=(Term)
DCG egyesítés. Egyesíti Term-et az implicit DCG argumentummal. Term-nek érvényes adat-termnek kell lennie.

Szemantikája:

	  transform(V_in, V_out, =(Term)) = (Term = V_in, V_out = V_in)
	

:=(Term)
DCG kimeneti egyesítés. Egyesíti Term-et az implicit DCG kimeneti argumentummal, a bemeneti DCG argumentumot figyelmen kívül hagyja. Term-nek érvényes adat-termnek kell lennie.

Szemantikája:

	  transform(V_in, V_out, :=(Term)) = (V_out = Term)
	

Term =^ field_list
Egy DCG mező kiválasztás. Egyesíti a Term kifejezést azzal az eredménnyel, melyet úgy kap, hogy az implicit DCG argumentumra alkalmazza a field_list mező kiválasztást. Term-nek érvényes adat-termnek kell lennie. field_list-nek érvényes mezőlistának kell lenniet. Lásd Rekord szintaxis.

Szemantikája:

	  transform(V_in, V_out, Term =^ field_list) = (Term = V_in ^ field_list, V_out = V_in)
	

^ field_list := Term
Egy DCG mező módosítás. Helyettesít egy mezőt az implicit DCG argumentumban. Term-nek érvényes adat-termnek kell lennie. field_list-nek érvényes mezőlistának kell lennie. Lásd Rekord szintaxis.

Szemantikája:

	  transform(V_in, V_out, ^ field_list := Term) = (V_out = V_in ^ field_list := Term)
	

DCG-call
Minden olyan term, melynek formája nem egyezik meg egyetlen fenti kifejezés formájával sem, egy DCG predikátum hívásnak kell lennie. Ha a term egy Var változó, akkor úgy kezeljük, mintha helyette call(Var) állna. Legvégül két implicit DCG argumentumot fűzünk a megadott argumentumokhoz.

Szemantikája:

	  transform(V_in, V_out, p(A1, ..., AN)) = p(A1, ..., AN, V_in, V_out)