A vágó és az indexelés kölcsönhatása
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.