BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2005/2006. tanév, őszi félév
|
A kis házi feladat beadása nem kötelező.
[1, 2, 2, 3, 3, 3, 2, 5-4, harom(kivansag), '9', 1.0]
lista
szép elemei az 1 és a 3. A 2 azért nem szép eleme, mert nem 2-ször szerepel,
a harom(kivansag)
és az 5-4
azért nem, mert nem
egész szám, hanem struktúra-kifejezés, a
'9'
azért nem, mert nem egész szám, hanem atom, az
1.0
pedig azért nem, mert nem egész szám, hanem lebegőpontos
szám.
A feladat felsorolni egy lista szép elemeit. Megírandó egy program Prolog
nyelven, amely tartalmazza az
annyiszor/2
eljárást, melynek jelentése a következő:
% annyiszor(+L,?E) pontosan akkor igaz, ha % az L listának E olyan pozitív egész eleme, ami E-szer % szerepel L-ben. Csak akkor kell helyesen működnie, ha L tömör. A lehetséges % E értékek felsorolási sorrendje tetszőleges.
Egy példamegoldás (khf-pl2.pl
), amely nem jó,
mert azokat a pozitív
egészeket is visszaadja, amelyek többször vagy kevesebbszer szerepelnek a
listában, mint az értékük:
:- use_module(library(lists)). annyiszor(L,E) :- sort(L,M), member(E,M), integer(E), E>0.A jobbrekurzív eljárások kevesebb memóriát igényelnek, mint az egyéb rekurzív eljárások, ezért a feladat megoldása során jobbrekurzív eljárások írása ajánlott, ám ez nem kötelező, a pontozásba nem számít bele.
| ?- annyiszor([1,2,2,3,3,3,2,5-4,harom(kivansag),'9',1.0],E). E = 1 ? ; E = 3 ? ; no | ?- annyiszor([3,3,2,2,1,3],E). E = 3 ? ; /* a sorrend tetszőleges */ E = 2 ? ; E = 1 ? ; no | ?- annyiszor([2,3,gyok(ketto),harom,s(s(s(0))),2],E). E = 2 ? ; no | ?- annyiszor([2,2,5,1,5,2,2,5,5,5],E). E = 5 ? ; /* a sorrend tetszőleges */ E = 1 ? ; no
teszt2.pl
):
:- consult('khf-pl2'). :- findall(E, annyiszor([1,ketto,2,harom(3),'3',3], E), L), L==[1]. :- findall(E, annyiszor([3,'1',3,2,3,2.0], E), L), L==[3]. :- findall(E, annyiszor([3,'1',3,2,3,1+1], E), L), L==[3]. :- findall(E, annyiszor([2,3,3,3,1,2,3,3,3], E), L), ( length(L,2) -> sort(L,M) ; L=M ), M==[1,2]. :- findall(E, annyiszor([999999999,999999999,2,1,1], E), L), L==[]. :- findall(E, annyiszor([5,9,2,10,9,7,8,3,5,8,4,4,9,10,8,6,6,10,5,3,6,7,6,6, 1,6,2,4,5,7,7,8,10,3,7,4,5,10,7,7,8,10,9,9,9,10,8,8,8,9,10,10,9,10,9],E), L), ( length(L,10) -> sort(L,M) ; L=M ), M==[1,2,3,4,5,6,7,8,9,10]. :- findall(E, annyiszor([888888888,10,10,9,9,9,9,tiz,10,s(s(s(7))),9,9,9,10, 8,9,10,10,8,7,10,8,7,6,8,7,6,10,8,8,8,7,6,6,6,8,6,4,5,9,4,5,3,4,3,5,7,7, 10,2,5,1,4,5,3,7,2,9], E), L), ( length(L,8) -> sort(L,M) ; L=M ), M==[1,2,3,4,5,6,7,8].Ha ezt a programot a környezet hiba nélkül betölti (pl. a
sicstus -l teszt2.pl
vagy a swipl -s
teszt2.pl
parancs hatására), akkor a khf-pl2.pl
-ben nincs
szintaktikai hiba, és a teszt2.pl
-ben leírt három teszteset is
hibátlanul fut le.
khf-pl2.pl
néven kell beküldeni a
megoldást. A névben meg kell különböztetni a kis- és nagybetűket.
A beadási határidő 2005. november 15., kedd 24:00.
A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatért plusz 1 pont jár (a 100 pontból).