| BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2004/2005. tanév, tavaszi félév
|
A kis házi feladat beadása nem kötelező.
A,
B és S számok, to és
step operátorok):
A;
A to B: csak akkor számlétra, ha
A =< B (javítva; régebben itt ``<'' volt)
A to B step S: csak akkor számlétra, ha
S =\= 0 és (B - A) / S >= 0.
Minden számlétra egy véges számtani sorozatot definiál:
A: az egyelemű (A) számtani sorozat
A to B: a lehető leghosszabb (A, A + 1,
A + 2, ...) számtani sorozat, melynek nincs
B-nél nagyobb eleme;
A to B step S: a lehető leghosszabb (A, A + S,
A + 2S, ...) számtani sorozat, melynek nincs
B-nél nagyobb eleme, ha S pozitív, illetve
B-nél kisebb eleme, ha S negatív.
Azt mondjuk, hogy egy X szám a számlétra tagja, ha X a számlétra által meghatározott sorozat egyik eleme.
Számlétralistának nevezünk egy listát, ha annak minden eleme számlétra. A
számlétralista taglistájának nevezzük azt a számokból álló listát, amelyet a
számlétralista elemeinek tagjaiból képezünk a számlétralistában balról
jobbra, egy számlistán belül pedig A-tól B felé haladva (az
azonos számokat nem összevonva). Például
az [1 to 5,5 to 12 step 3] számlétralista taglistája
az [1,2,3,4,5,5,8,11] számlista.
Két számlétralista ekvivalens, ha a taglistájuk megegyezik (az azonos
értékű lebegőpontos és egész számokat azonosnak tekintjük). Például
az [1 to 3,4 to 7] és
az [1,2.0 to 7] számlétralisták ekvivalensek, mert taglistájuk
ugyanaz: [1,2,3,4,5,6,7]. Egy
számlétralista minimális, ha nem létezik vele ekvivalens, nála rövidebb
(azaz kevesebb számlétrából álló) számlétralista. Például az [1,2.0 to 7]
számlétralista nem minimális, mert az [1.0 to 7] számlétralista
rövidebb nála, és ugyanaz a taglistájuk. Az [1.0 to 7]
számlétralista minimális (indoklás: csak az üres számlétralista rövidebb nála, de
az nem ekvivalens vele).
Megírandó egy program Prolog nyelven, amely tartalmazza az
kisletra/1 eljárást, melynek jelentése a következő:
% kisletra(+L) pontosan akkor igaz, ha L egy % minimális számlétralista. Feltételezhető, hogy L tömör Prolog-kifejezés.
A to és step operátorokat a program elején
definiálni kell. Célszerű 400-nál kisebb precedencia-számokat
választani. Ehhez segítség: például a beépített + és
* operátorokat így definiálták:
:- op(500, fx, '+'). :- op(500, yfx, '+'). :- op(400, yfx, '*').A
to és a step közül a step
precedencia-száma legyen nagyobb, vagyis az alábbi hívás sikeres legyen:
:- (1 to 3) step 2 == 1 to 3 step 2.
Egy példamegoldás (khf-pl3.pl), amely csak 0 és 1 elemű
számlétralistákra működik helyesen:
kisletra([]). kisletra([A]) :- number(A), !. kisletra([A to B]) :- number(A), number(B), !, A=<B. kisletra([A to B step S]) :- number(A), number(B), number(S), !, S=\=0, (B-A)/S >= 0.
Ötletek a megvalósításhoz:
=:=, =\=,
<, >, <= és
=< eljárásokat használjuk, ne pedig az
is, =, \=,
== vagy \== eljárásokat, mivel az utóbbiak
például a 3 és 3.0 számokat különbözőnek tekintik.
kisletra/1 eljárás
argumentumának egyik eleme
nem számlétra, akkor a hívásnak meg kell hiúsulnia.
(B-A)/S osztást el szabad végezni, és feltételezhető, hogy
az osztás eredménye pontos.
[3.0,4 to 5] számlétralista nem minimális, mert
két eleme összevonható.
kisletra([0 to 9999999]))
hívás túl hosszú ideig fut,
akkor nem fogadja el a megoldást.
.pl fájl
végére írhatók, és ha a SICStus a programot - goal failed üzenet
(az SWI-Prolog pedig Goal (directive) failed üzenet)
nélkül betölti, akkor a program a megadott példákra helyesen működik.
:- \+ kisletra(semmi). % rossz lista :- kisletra([]). :- kisletra([1]). :- kisletra([1 to 5]). :- kisletra([1 to 5 step 2.0]). :- kisletra([1 to 1]). :- kisletra([-1 to -1.0 step 42]). :- \+ kisletra([-1 to -1.0 step 0]). % rossz lista :- \+ kisletra([egy to 5 step 2.0]). % rossz lista :- \+ kisletra([1 to 5 step 0]). % rossz lista :- \+ kisletra([1 to 5 step 0.0]). % rossz lista :- \+ kisletra([1 to 5 step -2]). % rossz lista :- \+ kisletra([43,gyok(ketto),42]). % rossz lista :- \+ kisletra([1 to 8 step 3, 1.5, 3.5 to 2 step -1.4, 4 to 6, 9 to 8]). % rossz lista (az utolsó eleme nem számlétra) :- kisletra([1 to 8 step 3, 1.5, 3.5 to 2 step -1.4, 4 to 6]). :- \+ kisletra([1,3]). % rövidebb nála: [1 to 3 step 2] :- \+ kisletra([1,2.0]). % rövidebb nála: [1 to 2.0] :- kisletra([-1,-1]). % azonos számok nem vonhatók össze :- kisletra([3,3,3]). % azonos számok nem vonhatók össze :- kisletra([3,3 to 3]). % azonos számok nem vonhatók össze :- kisletra([1.0 to 3,5 to 6]). :- \+ kisletra([1 to 2,3 to 5 step 2,6]). % rövidebb nála: [1 to 3,5 to 6] :- \+ kisletra([1 to 2,3.0 to 5 step 2,6]). % rövidebb nála: [1 to 3,5 to 6] :- \+ kisletra([2.0,3 to 8]). % összevonható :- \+ kisletra([2 to 8.0,9]). % összevonható :- \+ kisletra([2 to 8.0,9 to 9 step 42]). % összevonható :- \+ kisletra([2 to 8.0,9 to 10 step 1.0]). % összevonható :- \+ kisletra([2 to 8.0,9 to 10 step 7.0]). % összevonható (!): [2 to 9] :- kisletra([3 to 8.0,9 to 23.0 step 7]). :- \+ kisletra([3 to 8.0,2,9.0 to 23.0 step 7]). % összevonható :- \+ kisletra([3 to 8.0,2.0,9 to 23.0 step 7]). % összevonható :- \+ kisletra([3 to 8.0,9,9 to 23.0 step 7]). % összevonható :- kisletra([-9999999 to 0, 0 to 9999999]). % nem vonható össze (dupla nulla), de a naiv implementáció timeout-os :- \+ kisletra([-9999999 to -0.25 step 0.25, 0 to 9999999 step 0.25]). % összevonható, de a naiv (kifejtő) implementáció timeout-os :- \+ kisletra([1,2 to 4 step 2,5 to 7 step 2, 8 to 8]). % rövidebb nála: [1 to 2,4 to 5,7 to 9]
.pl
fájl) végére írni, hogy a megoldás minden újratöltésekor tesztesetként
lefussanak. Ha a teszteseteket külön fájlba szeretnénk írni, akkor
hasznos lehet az alábbi segédprogram (teszt3.pl):
:- consult('khf-pl3').
% ide kell írni a fenti példákat (,,:-''-vel kezdődő sorok)
Ha ezt a programot a környezet hiba és figyelmeztetés nélkül betölti
(pl. a sicstus -l teszt3.pl vagy a swipl -s
teszt3.pl parancs hatására), akkor a khf-pl3.pl-ben nincs
szintaktikai hiba, és a teszt3.pl-ben leírt három teszteset is
hibátlanul fut le. Ha - goal failed vagy Goal (directive)
failed üzenetet kapunk, akkor az adott tesztesetre a program hibásan
működik.
khf-pl3.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. május 4., szerda 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).