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

A VIK Wikiből
A lap korábbi változatát látod, amilyen Szikszayl (vitalap | szerkesztései) 2014. február 15., 18:12-kor történt szerkesztése után volt. (Szikszayl átnevezte a(z) Kidolgozott Prolog vizsgafeladat: vízesés lapot a következő névre: Deklaratív programozás - Prolog vizsgafeladat: vízesés)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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.


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