Deklaratív programozás - Prolog vizsgafeladat: vízesés

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 19:55-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|DeklapoVizsgaVizeses}} ==Segédeljárás== Egy számlistában vízesésnek hívunk egy olyan legalább kételemű, folyamatos r…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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


Segédeljárás

Egy számlistában vízesésnek hívunk egy olyan legalább kételemű, folyamatos részlistát, amely szigorúan monoton csökkenő, a szomszédos elemek különbsége legalább 3, és egyik irányba sem terjeszthető ki ezen tulajdonságok megtartásával.

Írjon egy olyan Prolog eljárást, amely eldönti, hogy egy egészekből álló lista elején egy vízesés áll-e, és visszadja a vízesés első és utolsó elemét, valamint a bemeneti listának a megtalált vízesés utáni részét! Ha a bemeneti lista nem vízeséssel kezdődik, az eljárás hiúsuljon meg!

	% kezdo_vizeses(L, K, V, M): az L egészlista elején egy vízesés áll, amelynek
	%  első eleme K, utolsó eleme V, az utána következő elemek listája M.
	% :- pred kezdo_vizeses(list(int)::in, int::out, int::out, list(int)::out).

Példa:

	| ?- kezdo_vizeses([], K, V, M).
	no

	| ?- kezdo_vizeses([1,2,-5,20,15,12,7,3,0,-2], K, V, M).
	no

	| ?- kezdo_vizeses([2,-5,20,15,12,7,3,0,-2], K, V, M).
	K = 2, V = -5, M = [20, 15, 12, 7, 3, 0] ? ; no

Teljes feladat

A kezdo_vizeses/3 predikátum segítségével írjon egy olyan Prolog eljárást, amely felsorolja egészek egy adott listájában az összes benne megtalálható vízesés első és utolső elemét! A vízeséseket előfordulási sorrendjükben vegye sorra!

	% vizeses(L, K, V): K és V egy az L egészlistában előforduló vízesés első 
	% illetve utolsó eleme. 
	% :- pred vizeses(list(int)::in, int::out, int::out).

Példa:

	| ?- vizeses([0,2,5,5], K, V).
	no

	| ?- vizeses([1,2,-5,20,15,12,7,3,0,-2], K, V).
	K = 2, V = -5 ; K = 20, V = 0 ; no

Megoldás

Egy megoldás (azon túl, h. asszem helyesen működik, ofkorsz nem garantálhatok semmit):

kezdo_vizeses([L1,L2|L], K, V, M):-
	L2<L1-2, K=L1,
	(kezdo_vizeses([L2|L], _, V1, M1)
	 -> V=V1, M=M1
	 ;  V=L2, M=L).

vizeses(L, K, V):-
	(kezdo_vizeses(L,A,B,M)
	 -> (K=A, V=B; vizeses(M,K,V))
	 ;  [_|L2]=L, vizeses(L2,K,V)).

eSzeL