Deklaratív programozás - Prolog vizsgafeladat: vízesés
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