Determinizmus, indexelés és kölcsönhatásuk

A VIK Wikiből
(PrologElm17 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.1, 4.2.2
  • fóliák: 85-87, II.34-40

Az olyan Prolog-programok, amelyeknek bizonyos hívásai többféleképpen sikerülhetnek, nemdeterminisztikusak, amelyek csak egyféleképpen, determinisztikusak. Akkor mondjuk, hogy egy eljárás determinisztikusan futott le, ha nem hagyott maga után vágási pontot (azaz létre sem hozott, vagy mindegyiket megszüntette: levágta vagy kimerítette). A determinisztikus eljárásszervezés sokkal hatékonyabb, mint a Prolog visszalépést is lehetővé tevő eljárásszervezése. Ezért fontos, hogy a rendszer meg tudja különböztetni a determinisztikus és a nemdeterminisztikus eljárásokat.

A determinizmus felismerésére használja a Prolog az indexelést. Ez azt jelenti, hogy amikor meghívásra kerül az eljárás, a klózai közül kiszűrjük azokat, amelyek biztosan nem lesznek illeszthetők. A legtöbb Prolog az első argumentum szerint indexel: ha az argumentum változó, az eljárás minden klózzal illeszt, ha nem, akkor csak a megfelelő klózokkal. Az indexelést az első argumentum külső funktora alapján végzi (c/0, ha pl. c konstans az argumentum, R/N, ha egy R nevű, N argumentumszámú struktúra). Fontos, hogy ha az így létrejött klózsorozat egyelemű, nem hozunk létre vágási pontot.

A megfelelő klóz-sorozat a fordítás során elkészül, a futtatáskor már csak ezek közül kell (lényegében konstansidőben) választani.

Indexelés és aritmetika: nem foglalkozik aritmetikai vizsgálatokkal: N=0 és N>0 nem zárják ki egymást.

Indexelés és listák:

  • gyakran kell az üres és nem üres listát különválasztani
  • a bemenő listaargumentumokat célszerű az első pozícióba tenni
  • a [] és […|…] esetek különbözőek (funktoruk []/0 illetve '.'/2).
  • két klóz sorrendje nem számít, de tegyük a lezárót előre