Diszjunkciók és feltételes szerkezetek, kiváltásuk segédeljárással

A VIK Wikiből

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: 3.2.3, 3.7.2,
  • fóliák: I.93-96, I.99-103, II.16

3.2.3 Vezérlési szerkezetek

A Prologban nincsenek ciklusok, ezeket rekurzióval, illetve a beépített visszalépések segítségével válthatjuk ki. Pl.:

	 beléphet(X) :- látogató(X), van_engedélye(X).
	 beléphet(X) :- dolgozó(X).

Tehát X személy beléphet, ha látogató és van engedélye illetve akkor is beléphet ha dolgozó. Ez megegyezik a következő kódrészlet jelentésével:

	 beléphet(X) :-
		  látogató(X), van_engedélye(X)
		  ; dolgozó(X).

A ; operátor jelenti a vagy kapcsolatot.

Jellemzők

  • a diszjunkció akárhány tagú lehet
  • a ';' gyengébben köt, mint a ',', ezért a diszjunkciót mindig zárójelbe tesszük,

míg az ágait nem kell zárójelezni.

A diszjunkció egy segéd-predikátummal mindig kiküszöbölhető

  • Megkeressük azokat a változókat, amelyek a diszjunkcióban és azon kívül is előfordulnak.
  • A segéd-predikátumnak ezek a változók lesznek az argumentumai.
  • A segéd-predikátum minden klóza megfelel a diszjunkció egy ágának.

3.7.2 Feltételes kifejezések

  • if-then-else szerkezet
(...) :-
	 (...),
	 ( feltétel -> akkor ; egyébként ),
	 (...).
	  

A (felt -> akkor; egyébként), folytatás célsorozat végrehajtásának procedurális jelentése:

  • Végrehajtjuk a feltétel hívást.
  • Ha feltétel sikeres, akkor az akkor, folytatás célsorozatra redukáljuk a fenti célsorozatot, a feltétel első megoldása által eredményezett behelyettesítésekkel. A feltétel cél többi megoldását nem keressük meg.
  • Ha feltétel sikertelen, akkor az egyébként, folytatás célsorozatra redukáljuk, behelyettesítés nélkül.
  • többszörös elágaztatás (~case)
%Num szám előjele Sign
sign(Num, Sign) :-
	 ( Num>0 -> Sign=1
	 ; Num<0 -> Sign=-1
	 ; Sign=0 ).
	  
  • negáció
nem_eleme(E, L) :-
	 eleme(E, L) -> fail ; true