/* 
Megoldási variációk egy feladatra.
A kipróbáláshoz értelemszerűen helyezze át a kommenteket.

 

Gondoljon egy 0 és 15 közötti számot, kitalálom!


Megoldási ötlet: intervallumfelezés. Vagyis megkérdezzük, hogy a 
vizsgált tartomány középső értékénél kisebb vagy sem a vizsgált szám,
és a választól függően vagy az alsó vagy a fölső tartományt felezzük
tovább.
Ennek akkor van vége, ha már nem felezhető a tartomány.
(Feltéve persze, ha nem válaszol valaki szándékosan hibásan. Erre az esetre
is fel lehet készíteni a programot, ha kedve van, gondolja végig, hogyan.)

(Az intervallumfelezés nem feltétlenül prolog-szerű, de talán segít abban,
hogy megértse a prolog működését.)

Leírok néhány variációt, de NEHOGY betanulja a programot! ÉRTSE MEG!!
Persze, ahhoz, hogy megértse, tanulni kell, de nem magolni.
Gondolja végig, értse meg, próbálja ki (akár nyomkövetéssel is) az egyes 
variációkat! (Értelemszerűen el kell távolítani az aktuális komment-jeleket. :))


Felhasznált beépített eljárás: round/1 - nézze meg a help-ben.



Variációk:



1. variáció:
-----------
Egyetlen szabállyal oldottam meg (plusz az inditó szabály).
Ebben a szabályban többszörös elágazás van, amelyet zárójelezéssel
és a ";" -vel strukturáltam.

Ez a fajta tagolás lehet, hogy jobban hasonlít a már ismert 
programozási stílushoz. (Igaz, maga a feladat is inkább abba a 
témakörbe illik :))


*/


start :- hatarbe(Also,Felso), 
         writef('Gondoljon egy %w és %w közötti számot, kitalálom!\n', [Also,Felso]),
	 UjFelso is Felso+1, keres(Also,UjFelso).

hatarbe(Also,Felso) :- write('Az intervallum alsó határa: '), read(Also),
		       write('Az intervallum felső határa: '), read(Felso).

/*
keres(Also,Felso) :- 
		(
		Felso-Also > 1, Kozep is round((Also+Felso)/2), 
		writef('A gondolt szám kisebb mint %w? (i/n) ',[Kozep]), read(V), 
			( 
			V = 'i', keres(Also,Kozep) 
			;
			keres(Kozep,Felso))
			)
		;
		write('A gondolt szám: '),
			( V = 'i' , writeln(Also)
			;
		 	writeln(Felso)
			).


*/

/*
(Az összeadáshoz, szorzáshoz hasonlóan a ;/2 "gyengébb", mint a ,/2.
Ezért nem raktam dupla zárójelet. 
Lehetett volna így is (csak fölösleges a sok zárójel):

keres(Also,Felso) :- 
		(
		 (
		 Felso-Also > 1, Kozep is (Also+Felso)/2, 
		 writef('A gondolt szám kisebb mint %w? (i/n) ',[Kozep]), read(V),  
			( 
			V = 'i', keres(Also,Kozep) 
			;
			keres(Kozep,Felso))
			)
		 )
		 ;
		 (
		 write('A gondolt szám: '),
			( V = 'i' , writeln(Also)
			;
		 	writeln(Felso)
			)
		)
	       ).



*/



/*

2. variáció
----------

Ebben a megoldásban nem használom a ";"-t, helyette több azonos fejű 
szabállyal oldom meg az elágazást. A "vizsgal/4" predikátumra vonatkozó 
szabályt az elágazás megoldhatósága kedvéért kellett bevezetni.

Az utolsó szabályban azért a Kozep-et iratjuk ki és nem a Felso-t, mert
a feltételnek megfelelően a legutolsó felezés nem hajtódik végre.


*/

/*
keres(Also,Felso) :- Felso-Also > 1, Kozep is round((Also+Felso)/2), 
		writef('A gondolt szám kisebb mint %w ? (i/n) ', [Kozep]), 
		read(V), vizsgal(V,Also,Felso,Kozep).

vizsgal('i',Also,Felso,Kozep) :- Felso-Also > 1, keres(Also,Kozep). 
vizsgal(_,Also,Felso,Kozep) :- Felso-Also > 1, keres(Kozep,Felso).
vizsgal('i',Also,_,_) :- writef('A gondolt szám: %w\n',[Also]).
vizsgal(_,_,_,Kozep) :- writef('A gondolt szám: %w\n',[Kozep]).

*/



/*

3. variáció
-----------

Itt ismét csak egy szabályt írtam, használom a ;/2- t és használom a 
->/2 operátort is. (Help!)
(Ez az if-then-nek megfelelő Prolog operátor.)

*/

keres(Also,Felso) :- 
		Felso-Also > 1 -> Kozep is round((Also+Felso)/2), 
				writef('A gondolt szám kisebb mint %w? (i/n) ',[Kozep]), read(V),  
				  ( 
	 			    V = 'i' -> keres(Also,Kozep) ; keres(Kozep,Felso)
				  )
		;
		write('A gondolt szám: '),
			( V = 'i' , writeln(Also)
			;
		 	writeln(Felso)
			).

