A vágó és az indexelés kölcsönhatása

A VIK Wikiből
(PrologElm18 szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


  • fejezetek: 4.2.4, 4.2.5
  • fóliák: II.41-43

A fordító figyelembe veszi a vágót, ha garantált, hogy egy adott fő funktor esetén elérjük azt. Ennek feltételei:

  • Az első argumentum változó, konstans vagy csak változókat tartalmazó struktúra legyen.
  • a további argumentumok változók legyenek
  • a fejben az összes változóelőfordulás különböző legyen
  • a törzs első hívása a vágó

Ilyenkor a fordító az adott funktorhoz tartozó listából kihagyja a vágó utáni klózokat. Például:

q(1, 2) :- !.
q(X, X).

Vágó nélküli esetben (ha az első klóz helyett

q(1, 2).

-t írunk)

  • ha az első argumentum 1, a Prolog mindkét klózt megvizsgálja;
  • ha az első argumentum nem 1, az indexelés segítségével a másodikra szűkít.

Vágóval

  • ha az első argumentum 1, a fordító tudja, hogy csak az első klóz fog illeszkedni;
  • különben csak a második.

Másik példa: Fibonacci sorozat változatok

determinisztikus
(≤1-féleképpen sikerülhet)
determinisztikus lefutású
(nem hoz létre választási pontot, vagy levágja őket)
választásmentes
fib(1, 1).
fib(2, 2).
fib(N, F) :-
	N>2,
	N1 is N-1, N2 is N-2,
	fib(N1, F1), fib(N2, F2),
	F is F1+F2.
	  
fib(1, 1) :- !.
fib(2, 2) :- !.
fib(N, F) :-
	N>2,
	N1 is N-1, N2 is N-2,
	fib(N1, F1), fib(N2, F2),
	F is F1+F2.
	  
fib(1, F) :- !, F=1.
fib(2, F) := !, F=2.
fib(N, F) :-
	N>2,
	N1 is N-1, N2 is N-2,
	fib(N1, F1), fib(N2, F2),
	F is F1+F2.
	  

Választásmentesség diszjunktív feltételes szerkezetek esetén

Feltételes szerkezet végrehajtásakor általában választási pont jön létre.

A SICStus Prolog a (felt -> akkor ; egyébként) szerkezetet választásmentesen hajtja végre, ha a feltétel konjunkció tagjai csak:

  • aritmetikai összehasonlító eljáráshívások, és/vagy
  • kifejezés-típust ellenőrző eljáráshívások, és/vagy
  • általános összehasonlító eljáráshívások.