Nagyhatékonyságú Deklaratív Programozás Labor, 2024 tavaszi félév
Információk
Ez a lap a Nagyhatékonyságú Deklaratív Programozás Labor tárgy anyagára vonatkozó
információkat tartalmaz.
Friss hírek
- (2024.05.22) ZH minta-feladatok letölthetők innen.
- (2024.04.29) A kurzus 20 évvel ezelőtti változatáról szóló
cikk letölthető innen.
- (2024.03.04) Az egyszerűbb clpfd feladatok megoldására
online is használható eszköz az SWI Prolog SWISH felülete, amely
sajnos egyes korlátok esetében eltér a SICStus jelöléstől. A
megoldás a
következő link
használata, amely a SICStus által használt eljárásnevekké nevezi át
az SWI könyvtár által nyújtott szolgáltatásokat (a betöltött fájl letölthető
innen).
- (2024.03.04) A CLPFD korlát-végrehajtás gyakorlására szolgáló alkalmazás
- (2024.02.26) A. Colmerauer cikke CLPQ/R-ről
- (2024.02.18) SICStus Prolog 4.9.0 licensz igényelhető az ETS-rendszerben
- (2024.02.01) Hasznos anyagok Prologgal most ismerkedők számára:
- Prolog rendszerek:
SWI Prolog webes
felület, Tau Prolog
homokozó (keresési fa kirajzolásához)
- Deklaratív Programozás (DP)
c. tárgy 2021 őszi kurzusának honlapja
- DP jegyzet és fogalomtár
letölthető erről a
lapról
- A Prolog végrehajtás gyakorlására szolgáló alkalmazás
- A DP tárgy 2020 őszi kurzusának bevezető Prolog videói:
- ea06 (mp4, 01:27:50, 176 MB)
26:30 perctől
- ea07 (mp4, 01:29:36, 191 MB)
- ea08 (mp4, 01:28:42, 191 MB)
Előadásdiák (2024 tavasz)
Az első előadások diái:
A 2021. tavaszi félév videófelvételei (előadások és konzultációk)
A felvételek megtalálhatók
itt,
A 2002. évi előadásokról készült jegyzet-kézirat
Példaprogramok
- Programok - az első néhány előadáson
szereplő példaprogramok szövege, futási példákkal, plusz az első kisházi
megoldása bináris (.po) formában.
Házi feladatok
A házi feladatok beadásához be kell jelentkezni az NDP ETS rendszerébe. Ezután "HF beadás" menűpont alatt lehet
az adott házi feladatot beadni.
1. kis házi feladat:
A kiírás
innen
letölthető. A kiírás kiegészítéseként pontosítjuk a count/2
predikátummal szembeni elvárásokat:
- ne csináljon választási pontot (lásd a 4. futási példát a fólián).
-
count(L, N)
-ben, ha az L
lista N
db eleméről kiderül, hogy 1-es, akkor nem
vár további változó-behelyettesítésre és a fennmaradó változókat
behelyettesíti 0-ra.
Pl. a `count([X,Y,Z], 1), Z=1
' célsorozat az `X=0, Y=0, Z=1
' eredményt adja.
-
count(L, N)
-ben, ha az L
lista len(L)-N
db eleméről kiderül, hogy 0, akkor nem
vár további változó-behelyettesítésre és a fennmaradó változókat
behelyettesíti 1-re.
Pl. a `count([X,Y,Z], 2), Z=0
' célsorozat az `X=1, Y=1, Z=0
' eredményt adja.
A kis házi feladat "minta"-megvalósítása (.po formában, tehát futtathatóan,
de nem olvashatóan) és tesztpéldái az első három előadás példaprogramjaival
együtt letölthetőek
innen.
Az 1. kis házi feladat beadása:
A KHF az NDP ETS rendszerének
segítségével adható be.
A beadási határidő 2024. március 4, hétfő, 23:59.
2. kis házi feladat:
A kiírás a fóliákon megtalálható, de a szóbanforgó egy
oldal (PDF alakban) innen is
letölthető.
Fontos megjegyzesek:
- Az egyes "szavak" elemei különböző számok
kell legyenek.
- Egyes "szavak"-nak (pl. az egy kockából állóknak)
nincs megadva az összege, tehát ez esetben is x szerepel az összeg
helyén! (Lásd pl. az alábbi tesztpéldák között a
p2
példában a mátrix 4. sorának 3. oszlopában szereplő x\x
értéket!).
- A feladvány nemzetközi neve: kakuro, a rá vonatkozó Wikipédia
lap itt található.
- Hogyan oldjunk meg kakuro rejtvényeket:
videó.
- Sok interaktív feladványmegoldó is található a világhálón.
A kis házi feladat tesztpéldái megtalálhatók
itt.
A 2. kis házi feladat beadása:
A KHF az NDP ETS rendszerének segítségével adható be.
A beadási határidő 2024. március 25. hétfő, 23:59.
3. kis házi feladat:
A CLPFD gyakorló feladatsor
megoldása nlp3.pl
néven beadható az ETS-ben.
A beadási határidő 2024. április 8, hétfő, 23:59.
4. kis házi feladat:
A KHF az NDP ETS rendszerének segítségével adható be.
A kiírás a fóliákon megtalálható, de a szóbanforgó egy
oldal (PDF alakban) innen is
letölthető.
A kis házi feladat beadásakor a következő környezetet használom:
:- use_module(library(lists)).
:- assert(clpfd:full_answer).
globtest(Before, Constraint, After, Result) :-
Constraint = max_lt(List, Z),
Goal = (Before, Constraint, After,
maplist(fd_dom, [Z|List], [ZDom|ListDom])),
( call_residue_vars( Goal, Vars) ->
( is_active(max_lt(_,_), Vars) ->
Result = active(ListDom, ZDom)
; Result = exited(ListDom, ZDom)
)
; Result = failed
).
is_active(Goal, Vars) :-
member(Var, Vars),
frozen(Var, VarF),
in_goal(VarF, Goal).
in_goal(_:Gs, G) :- !,
in_goal(Gs, G).
in_goal((Gs1,Gs2), G) :- !,
( in_goal(Gs1, G) -> true
; in_goal(Gs2, G)
).
in_goal(G, G).
step_up(X, _I) :-
nonvar(X), !.
step_up(X, I) :-
X #> I, I1 is I+1,
step_up(X, I1).
Példafutások:
| ?- globtest(true, max_lt([A,B,C],Z), (A in 1..5, B #> 2, Z in 0..6), Result).
Result = active([1..5,3..5,inf..5],4..6) ? ;
no
| ?- globtest(domain([X,Y,Z], 0, 9), max_lt([X,Y],Z), (Z=5, Y=6), Result).
Result = failed ? ;
no
| ?- globtest(true, max_lt([A],Z), (A in {0,9}, Z in {3,6}), Result).
A = 0,
Result = exited([{0}],{3}\/{6}) ? ;
no
| ?- globtest((length(L, 500),domain(L, 1, 5) , X in 5..50000),
max_lt([X|L], Z),
step_up(X, 5), Result).
L = [_A,_B,_C,_D,_E,_F,_G,_H,_I,_J|...],
X = 10000,
Result = exited([{10000},1..5,1..5,1..5,1..5,1..5,1..5,1..5,... .. ...|...],10001..sup) ? ;
no
| ?-
Megjegyzések:
- Az utolsó teszt hivatott azt eldönteni, hogy a megoldás használ-e
állapotot, vagy sem. Állapot nélkül ugyanis 500-szor több listaelemet
kell végignéznie...
- Az eredményben a struktúra funktora jelzi, hogy a globális korlát
lefutott-e (
exited
), vagy sem (active
). Mivel a lefutás pontos
ellenőrzése általában felesleges, ezért az active
elfogadható az exited
helyett, de nem fordítva. Például
a fentiek közül az utolsó két esetben a tesztrendszer elfogadja az
active
funktorú eredményt, de az első tesztesetben az
exited
eredményt nem.
A 4. kis házi feladat beadása:
A KHF az NDP ETS rendszerének segítségével adható be.
- Ez a 4. kis házi feladat, a megoldás a beadáskor az
nlp4.pl
fájlnevet kapja (a beadott fájl neve bármi lehet).
-
A beadási határidő 2024. április 29, hétfő, 23:59.
5.-6. kis házi feladatok:
Az FD predikátumok jelentését ellenőrző segédprogram letölthető
innen.
A kiírás a fóliákon megtalálható, de a szóbanforgó egy
oldal (PDF alakban) innen is
letölthető.
A kis házi feladat futtatásakor a következő segédeljárást használjuk:
fdtest([X,Y,Z,B], Goal, [XR,YR,ZR,BR]) :-
domain([X,Y,Z], 0, 9),
'z>max(x,y)'(X, Y, Z) #<=> B,
call(Goal),
fd_dom(X, XR),
fd_dom(Y, YR),
fd_dom(Z, ZR),
fd_dom(B, BR).
Az 5.-6. kis házi feladat beadása:
A KHF az NDP ETS rendszerének segítségével adható be.
Nagy házi feladat
A nagy házi feladat megoldása kötelező.
A házi feladat kiírása.
A beadási határidő: 2024. május 24. péntek, 23:59.
A házi feladat keretprogramja tesztesetekkel
együtt letölthető a tgz archivumból.
A beadáskor használt tesztesetek rendre a következő sorszámmal szerepelnek
a fenti tgz file tests könyvtárában: 077 078 079 178 247 256 246 260 147 290.
Érdekességek
- Érdekes sudoku variáns
- Regin cikk a global_cardinality
korlátról cikk
A rokon tárgyakról Szeredi
Péter oktatási honlapján található
információ.
szeredi@cs.bme.hu