Szeredi Péter, Benkő Tamás
1. Tekintsd a következő FD-predikátumot:
pred(X, Y) +: Y in (inf..200) /\ (inf..X*10).
2. Globális korlátként írj meg egy legf1poz(L)
predikátumot, amely
azt fejezi ki, hogy az L lista elemei között legfeljebb egy pozitív
(> 0) szám van.
Példák:
| ?- legf1poz([A,B,C]), C #>=2. A in inf..0, B in inf..0, C in 2..sup ? | ?- legf1poz([A,B,C]), C #=< 0, B = 0. A in inf..sup, B = 0, C in inf..0 ? | ?- legf1poz([A,B,C]), C #>= 1, B = 2. no
3. Nevezzünk egy L listát N-változatosnak, ha L-nek nincs csupa azonos elemből álló N hosszúságú folytonos részlistája, azaz bármely N szomszédos elem között legalább két különböző érték fordul elő.
Írd meg a következő relációt a library(clpfd) segítségével! Ne használj választási pontokat (spekulatív diszjunkciót)!
valto(L, N): Az L lista N-változatos.
Példák:
| ?- L = [_C,1,_,2,_C], domain(L, 1, 3), valto(L, 2). L = [3,1,3,2,3] ? | ?- L = [_,1,_,_,2,_], domain(L, 1, 2), valto(L, 2). L = [2,1,2,1,2,1] ? | ?- L = [_,1,_,2,_], domain(L, 1, 2), valto(L, 2). no
4. Tekintsd az alábbi Mercury programot! Add meg a felhasznált típusok
deklarációját, a hiányzó predikátum-deklarációkat, és azokat a
predikátummód-deklarációkat, amelyek a p1
és p2
predikátumokhoz szükségesek! Add meg a determinizmusokat is! Ne
hagyatkozz implikált módokra!
A program:
% zip(P, A, B, C): Az A és a B egyforma hosszú listák azonos indexű % elemeit a P predikátum szerint komponálva es ezeket listába gyűjtve % kapjuk a C listát. :- pred zip(pred(T, T, T), list(T), list(T), list(T)). zip(_, [], [], []). zip(P, [H1|T1], [H2|T2], [H3|T3]) :- call(P, H1, H2, H3), zip(P, T1, T2, T3). p1(A, B, C) :- zip((pred(X::in,Y::out,Z::in) is semidet :- X-Y = Z), A, B, C). p2(A, B, C) :- zip((pred(X::in,Y::in,Z::out) is det :- [X|Y] = Z), A, B, C).
5. Tekintsd az alábbi CHR programot.
:- use_module(library(chr)). handler bool. constraints or/3, neg/2. or1@ or(0,X,Y) <=> Y=X. or2@ or(X,0,Y) <=> Y=X. or3@ or(X,Y,0) <=> X=0,Y=0. or4@ or(1,X,Y) <=> Y=1. or5@ or(X,1,Y) <=> Y=1. or6@ or(X,X,Z) <=> X=Z. neg1@ neg(0,X) <=> X=1. neg2@ neg(X,0) <=> X=1. neg3@ neg(1,X) <=> X=0. neg4@ neg(X,1) <=> X=0. neg5@ neg(X,X) <=> fail. neg6@ neg(X,Y) \ or(X,Y,Z) <=> Z=1. neg7@ neg(Y,X) \ or(X,Y,Z) <=> Z=1.
Lépésenként írd le az alábbi cél futását, megadva melyik szabály tüzel és hogyan alakul a tár.
| ?- or(A, B, C), neg(A, B), neg(C, D), or(A, C, B).
1. Határozd meg a változók tartományának
változását az alábbi célsorozat végrehajtása során! Lépésenként írd le,
hogy az a, b és c betűkkel jelzett korlátokból
milyen démonok keletkeznek, ezek mikor ébrednek fel milyen szűkítést
végezve, és mikor fejezik be működésüket!
nevtelen(X, Y, Z) +: Z in ((min(X)..sup) /\ (min(Y)..sup)) /\ ((inf..max(X)) \/ (inf..max(Y))).
| ?- domain([X,Y,Z], 2, 5), /*a:*/ X+Y#=6, /*b:*/ nevtelen(X,Y,Z), /*c:*/ Y#>3.
2. Írj egy optimum/7 eljárást a library(clpq) segítségével, amellyel egy kéterőforrásos lineáris optimalizálási feladatot lehet megoldani!
optimum/7 első argumentuma egy lista, amely az egyes termékek mennyiséget tartalmazza, második argumentuma az első erőforrás kapacitása, a harmadik egy lista, melynek i. eleme az i. termék által igényelt kapacitás. A negyedik és az ötödik argumentum olyan mint az előző kettő, csak a második erőforrásra vonatkozik. A hatodik argumentum i. eleme az i. termék profitja, a hetedik a maximális összprofit. Az első és a hetedik argumentum kimenő, a többi bemenő.
Példa:
| ?- optimum([X,Y,Z], 7, [1,5,2], 16, [3,8,5], [5/2,7,9/3], P). P = 95/7, X = 24/7, Y = 5/7, Z = 0 ? ; no
3. Definiáld az eq1(L)
globális korlátot, amely 0-1 értékű változók
listájára biztosítja, hogy a lista elemei között pontosan egy darab 1-es
van. Csak a hiányzó részt kell megírnod.
% L egy bitvektor, amiben pontosan 1 db 1-es van. eq1(L) :- domain(L, 0, 1), val_susps(L, S), fd_global(eq1, L, S). val_susps([], []). val_susps([H|T], [val(H)|VT]) :- val_susps(T, VT).
Példák:
| ?- eq1([A,B,C]), C = 1. A = 0, B = 0, C = 1 ? ; no | ?- eq1([A,B,C]), C = 0. C = 0, A in 0..1, B in 0..1 ? ; no | ?- eq1([A,B,C]), C = 0, A = 0. A = 0, B = 1, C = 0 ? ; no | ?- eq1([A,B,C]), C = 1, A = 1. no
4. A feladat a 8. rejtvenyfejtő világbajnokság egyik rejtvényének alaplépését fogalmazza meg. A rejtvény a következő:
Egy négyzetrács minden sorába és minden oszlopába az [1,n] számok egy permutációját kell elhelyezni, ahol n a rács szélessége. A számok felhőkarcolók magasságát reprezentálják, a nagyobb számok magasabbakat. A széleken levő számok adottak, és azt mutatják, hogy hány felhőkarcoló látható az adott irányból.
Alább egy rejtvény és a megoldása (a helyesen kitöltött pálya) látható.
|
|
Írd meg a fenti rejtvényhez kapcsolódó relációt a library(clpfd) segítségével! Ne használj választási pontokat (spekulatív diszjunkciót)!
emelkedo(Valtozok, Hossz, Lathatok): Valtozok az 1 és Hossz közötti egész számok permutációját tartalmazó lista, amelyben a látható elemek száma Lathatok (láthatónak hívunk egy elemet, ha a listában előtte álló elemek mindegyikénél nagyobb).
Példák:
| ?- emelkedo(L,3,3), labeling([], L). L = [1,2,3] ? ; no | ?- emelkedo(L,3,2), labeling([], L). L = [1,3,2] ? ; L = [2,1,3] ; L = [2,3,1] ? ; no
5. Tekintsd az alábbi Mercury programot! Add meg a felhasznált típusok
deklarációját és azokat a predikátummód-deklarációkat, amelyek a p1
és p2
predikátumokhoz szükségesek! Add meg a determinizmusokat is!
Ne hagyatkozz implikált módokra!
A program:
% transform(P, A, B): Az A fanak a P predikatum szerinti % transzformaltja a B fa. :- pred transform(pred(T, T), bfa(T), bfa(T)). transform(P, level(A), level(B)) :- call(P, A, B). transform(P, ag(A, BFa1, JFa1), ag(B, BFa2, JFa2)) :- call(P, A, B), transform(P, BFa1, BFa2), transform(P, JFa1, JFa2).
A hívási környezet:
:- pred p1(bfa(lista)::out, bfa(lista)::out). p1(A, B) :- transform((pred(X::out,Y::out) is multi :- append(X,Y,[1,2,3])), A, B). :- pred p2(bfa(list(T))::in, bfa(list(T))::out). p2(A, B) :- transform((pred(X::in,Y::out) is semidet :- [_|Y] = X), A, B).
Az alábbi 1.-4. feladatok megegyeznek az 1999. évi vizsgafeladatokkal.
1. Határozd meg a változók tartományának változását az
alábbi célsorozat végrehajtása során! Lépésenként írd le, hogy az a,
b és c betűkkel jelzett korlátokból milyen démonok keletkeznek,
ezek mikor ébrednek fel milyen szűkítést végezve, és mikor fejezik be
működésüket! (Az X*C#=Y korlát intervallum-konzisztens.)
| ?- domain([X,Y], 1, 5), /*a:*/ Z#>2, /*b:*/ X#=<Y #=> Z#=<Y, /*c:*/ X*2#=Y.
2. Írj egy megold/3 eljárást a library(clpr) segítségével, amellyel egy n-ismeretlenes lineáris egyenletet lehet megoldani! megold/3 első argumentuma egy n*n-es valós mátrix, az egyenletek együtthatóiból álló vektorok listájaként ábrázolva, a második az egyenletek jobb-oldalát megadó n-es valós vektor, a harmadik, kimenő argumentum pedig a szintén n-es megoldásvektor.
Példa:
| ?- megold([[1,2],[3,4]], [7,15], V). V = [1.0,3.0] ?
3. Definiáld az 'x>0\/y>0'(X, Y)
korlátot, amely nevének megfelelő
jelentésű, és lehetőleg minél erősebb szűkítést biztosít!
Példák:
| ?- domain([X,Y], -10, 10), 'x>0\/y>0'(X, Y), X#>3. X in 4..10, Y in-10..10 ? | ?- domain([X,Y], -10, 10), 'x>0\/y>0'(X, Y), X#<1. X in-10..0, Y in 1..10 ? | ?- domain([X,Y], -10, 10), 'x>0\/y>0'(X, Y), Y#<1. X in 1..10, Y in-10..0 ?
4. Írd meg a következő relációt a library(clpfd) segítségével! Ne használj választási pontokat (spekulatív diszjunkciót)!
szakaszok(BitV, N, Hosszak): N adott egész, Hosszak adott egész-lista, BitV 0..1 értékű korlát-változók N hosszú listája. A BitV bitvektorban a folytonos 1-esek szakaszainak hosszai a Hosszak listát adják. Például szakaszok([0,1,1,0,1,1,1], 7, [2,3]) igaz.
Példák:
| ?- szakaszok(BV, 7, [2,3]). BV = [_A,1,_B,_C,1,1,_D], _A in 0..1, _B in 0..1, _C in 0..1, _D in 0..1 ? | ?- szakaszok(BV, 7, [2,3]), BV=[0|_]. BV = [0,1,1,0,1,1,1] ?
5. Tekintsd az alábbi Mercury programot! Add meg a felhasznált típusok
deklarációját, a predikátum-deklarációkat, és azokat a
predikátummód-deklarációkat, amelyek a p1
, p2
és p3
predikátumokhoz szükségesek! Add meg a determinizmusokat is! Ne
hagyatkozz implikált módokra!
A program:
ut(Graf, _, Hova, Hova, [Hova], 0) :- ele(Graf, Hova, _, _). ut(Graf, Suly, Honnan, Hova, [Honnan|Ut], Koltseg+S) :- ele(Graf, Honnan, Kozben, MGraf), S = apply(Suly, el(Honnan, Kozben)), ut(MGraf, Suly, Kozben, Hova, Ut, Koltseg). ele([el(A,B)|G], A, B, G). ele([E|G], A, B, [E|G1]) :- ele(G, A, B, G1).
A hívási környezet:
:- pred p1(int, int, list(int), int). :- mode p1(out, out, out, out). p1(Honnan, Hova, Ut, Koltseg) :- ut([el(1,2),el(1,4),el(2,3)], suly, Honnan, Hova, Ut, Koltseg). :- pred p2(int, int, int). :- mode p2(out, out, out). p2(Honnan, Hova, Koltseg) :- ut([el(1,2),el(1,4),el(2,3)], suly, Honnan, Hova, [1,2,3], Koltseg). :- pred p3(int, list(int)). :- mode p3(in, in). p3(Hova, Ut) :- ut([el(1,2),el(1,4),el(2,3)], suly, 2, Hova, Ut, 4). :- func suly(el) = int. suly(el(A,B)) = S :- ( A = 1 -> S = 1 ; S = A-B ).
domain: X in 1..5, Y in 1..5 a: Z#>2 végleg lefut (nem keletkezik démon) tár: X in 1..5, Y in 1..5, Z in 3..sup b: X#=<Y #<=> B1, Z#=<Y #<=> B2, B1 #=< B2 (kifejtés) az első két korlátból fejenként 3 démon keletkezik, az utolsóból 1, tár: X in 1..5, Y in 1..5, Z in 3..sup, B1 in 0..1, B2 in 0..1 c: X*2#=Y 1 démon keletkezik, szűkíti X és Y tartományát. tár: X in 1..2, Y in 2..4, Z in 3..sup, B1 in 0..1, B2 in 0..1 b: X#=<Y levezethető, felébred a ... #<=> B1 pozitív levezethetőségi démon, behelyettesíti B1-t tár: X in 1..2, Y in 2..4, Z in 3..sup, B1 = 1, B2 in 0..1 b: B1 #=< B2 felébred, behelyettesíti B2-t tár: X in 1..2, Y in 2..4, Z in 3..sup, B1 = 1, B2 = 1 b: felébred a ... #<=> B2 postázó démon, felveszi a Z#=<Y korlátot (nevezzük d-nek) d: szűkíti Y-t és Z-t tár: X in 1..2, Y in 3..4, Z in 3..4, B1 = 1, B2 = 1 c: X*2#=Y felébred, behelyettesíti mindkét változóját, befejezi működését tár: X = 2, Y = 4, Z in 3..4, B1 = 1, B2 = 1 d: felébred, nem szűkít, elvben befejezheti működését tár: X = 2, Y = 4, Z in 3..4, B1 = 1, B2 = 1
% skalarszorzat(Ak, Bk, Sz): Ak es Bk vektorok skalarszorzata Sz. skalarszorzat([], [], 0). skalarszorzat([C|Ck], [X|Xk], Sz+C*X) :- skalarszorzat(Ck, Xk, Sz). % megold(M, A, X): M X = A, ahol M egy nxn-es matrix, % A es X n hosszusagu vektorok. megold([], [], _). megold([S|Sk], [E|Ek], V) :- skalarszorzat(S, V, SV), {SV = E}, megold(Sk, Ek, V).
'x>0\/y>0'(X, Y) +: X in (1..max(Y)) ? (inf..sup) \/ (1..sup), Y in (1..max(X)) ? (inf..sup) \/ (1..sup).
% szakaszok(BitV, N, Hosszak): N adott egész, Hosszak adott % egész-lista, BitV 0..1 értékű korlát-változók N hosszú listája. A BitV % bitvektorban a folytonos 1-esek szakaszainak hosszai a Hosszak listát % adják. Például szakaszok([0,1,1,0,1,1,1], 7, [2,3]) igaz. szakaszok(BoolV, Szelesseg, HosszL) :- length(BoolV, Szelesseg), domain(BoolV, 0, 1), szakasz_valtozok(HosszL, SzakaszL, 0, Szelesseg), pozicio_korlatok(BoolV, 1, SzakaszL). % szakasz_valtozok(Hk, KHk, K0, Sz): Hk egy diszjunkt szakaszok hosszainak % listaja. KHk egy K-H alaku parokbol allo szakaszleiro lista, ahol H a Hk % lista megfelelo eleme, K pedig az adott H hosszu szakasz kezdopozicioja % (korlat valtozo), felteve, hogy ezt a Hk szakaszlistat a [K0,Sz] % intervallumba kell elhelyezni. szakasz_valtozok([], [], _, _). szakasz_valtozok([H|Hk], [K-H|Kk], K0, Sz) :- Felso is Sz-H+1, K in 1..Felso, K #> K0, K1 #= K+H, szakasz_valtozok(Hk, Kk, K1, Sz). % pozicio_korlatok(Bk, I, SzakaszL): A SzakaszL szakaszleiro lista megfelel % a Bk bitlistanak, felteve, hogy Bk elso elemenek indexe I. pozicio_korlatok([], _, _). pozicio_korlatok([B|Bk], I, SzakaszL) :- elofordulasai(SzakaszL, I, BL), sum(BL, #=, B), I1 is I+1, pozicio_korlatok(Bk, I1, SzakaszL). % elofordulasai(SzakaszL, I, BL): BL[k]=1, ha a SzakaszL[k] tartalmazza az % I indexu pontot, 0 egyebkent. elofordulasai([], _, []). elofordulasai([K-H|KHk], I, [B|Bk]) :- I0 is I-H+1, K in I0..I #<=> B, elofordulasai(KHk, I, Bk).
:- type pont == int. :- type el ---> el(pont,pont). :- type graf == list(el). :- type ut == list(int). :- pred ut(graf, func(el)=int, pont, pont, ut, int). :- mode ut(in, func(in)=out is det, out, out, out, out) is nondet. % p1 :- mode ut(in, func(in)=out is det, out, out, in, out) is nondet. % p2 :- mode ut(in, func(in)=out is det, in, in, in, in) is semidet. % p3 :- pred ele(graf, pont, pont, graf). :- mode ele(in, out, out, out) is nondet. :- mode ele(in, in, out, out) is nondet.
1. Határozd meg a változók tartományának
változását az alábbi célsorozat végrehajtása során! Lépésenként írd le,
hogy az egyes korlátokból
milyen démonok keletkeznek, ezek mikor ébrednek fel milyen szűkítést
végezve, és mikor fejezik be működésüket!
?- X in 1..8, Y in 21..40, Y #>= 20+2*X, element(X, [21,23,26,27,32], Y).
2. Írj egy library(clpfd) programot az alábbi feladat
megoldására!
pyth(N, X, Y, Z): Az X, Y és Z N jegyű egész számok Pythagorasi számhármast alkotnak, azaz az első két szám négyzetösszege a harmadik. N bemenő paraméter. Az érték kiszámolására SICStus-ban használható az A is integer(exp(10, N)) eljáráshívás.
Példa:
| ?- pyth(1, X, Y, Z). X = 3, Y = 4, Z = 5 ? ; X = 4, Y = 3, Z = 5 ? ; no | ?-
3. Definiáld FD-predikátummal (indexikálisokkal) az 'x=<y=<2x'(X, Y)
constraintet, amely nevének megfelelő jelentésű, és lehetőleg minél erősebb
szűkítést biztosít! Írd meg az FD-predikátum mind a négy klózát!
Példák:
| ?- X in 3..4, 'x=<y=<2x'(X, Y). X in 3..4, Y in 3..8 ? | ?- Y in 11..20, 'x=<y=<2x'(X, Y). Y in 11..20, X in 6..20 ? | ?- X in 3..4, #\ 'x=<y=<2x'(X,Y). X in 3..4, Y in(inf..3)\/(7..sup) ? | ?- X in 3..4, Y in (inf..2)\/(9..sup), 'x=<y=<2x'(X,Y) #<=> B. B = 0, X in 3..4, Y in(inf..2)\/(9..sup) ? | ?- X in 3..4, Y in 4..6, 'x=<y=<2x'(X,Y) #<=> B. B = 1, X in 3..4, Y in 4..6 ?
4. Írd meg a következő predikátumot a
library(clpfd) segítségével! Ne használj választási pontokat
(spekulatív diszjunkciót)!
profilja(L, P): Az L n elemű lista profilja a P n-1 elemű lista, ha , i=1, ..., n-1. Azaz, ha L első két eleme a és b, akkor P első elemének értéke 1, ha a<b; -1, ha a>b; és 0, ha a=b, stb.
Példák:
| ?- length(L, 4), domain(L, 1, 3), profilja(L, [1,1,1]). no | ?- length(L, 4), domain(L, 1, 3), profilja(L, [1,1,0]). L = [1,2,3,3] ? ; no
1. Határozd meg a változók tartományának
változását az alábbi célsorozat végrehajtása során! Lépésenként írd le,
hogy az egyes korlátokból
milyen démonok keletkeznek, ezek mikor ébrednek fel milyen szűkítést
végezve, és mikor fejezik be működésüket!
?- domain([X,Y], 0, 100), X+Y #>= 9, element(X, [1,2,6,24,120], Y), X-Y #> 3.
2. Írj egy library(clpfd) programot az alábbi feladat
megoldására!
joszam(X): Az X egész szám kétjegyű, négyzete háromjegyű és a négyzet első két jegye forított sorrendben leírva az X számot adja.
3. Definiáld FD-predikátummal (indexikálisokkal) az 'x-y>=10'(X,
Y) constraintet, amely nevének megfelelő jelentésű! Írd meg az
FD-predikátum mind a négy klózát!
4. Írd meg a mastermind játékkal kapcsolatos következő predikátumot a
library(clpfd) segítségével! Ne használj választási pontokat
(spekulatív diszjunkciót)!
feketek(Rk, Tk, N, F): Az Rk (rejtettek) változó-lista és a Tk (tippek) egész-lista azonos hosszúak. N és F konkrét egész számok. Rk minden eleme az 1..N tartományba esik. A predikátum jelentése: Az F szám (fekete találatok) nem más mint az Rk lista azon elemeinek száma, amelyek értéke megegyezik a Tk lista azonos sorszámú elemével.
Példa:
?- feketek([A,B,C], [1,2,3], 3, 0). A in {2,3}, B in {1,3}, C in {1,2}
1. Határozd meg a változók tartományának
változását az alábbi célsorozat végrehajtása során! Lépésenként írd le,
hogy az egyes korlátokból
milyen démonok keletkeznek, ezek mikor ébrednek fel milyen szűkítést
végezve, és mikor fejezik be működésüket!
?- domain([X,Y], 1, 10), X+Y #=< 10, element(X, [1,1,4,4,9,9], Y), X #> Y.
2. Írj egy library(clpfd) programot az alábbi feladat
megoldására!
joszam(X): Az X egész szám kétjegyű, négyzete háromjegyű és a négyzet első két jegye az X számnál 2-vel nagyobb szám.
3. Definiáld FD-predikátummal (indexikálisokkal) az 'x+y=<z'(X,
Y, Z) constraintet, amely nevének megfelelő jelentésű, és
intervallum-konzisztenciát ill. -levezethetőséget biztosít! Írd meg az
FD-predikátum mind a négy klózát!
4. Írd meg a következő eljárást a
library(clpfd) segítségével! Ne használj választási pontokat
(spekulatív diszjunkciót)!
jo(N, L, T): Az L lista N hosszú és elemei az 1..N intervallumból való különböző számok, továbbá az I-edik pozíción nem állhat az I szám. T az abs(L[I]-I) eltérések összege, I= 1..N. Adott N esetén L egy olyan lista, amelyre T minimális.
1. Határozd meg a változók tartományának
változását az alábbi célsorozat végrehajtása során! Lépésenként írd le,
hogy az egyes korlátokból
milyen démonok keletkeznek, ezek mikor ébrednek fel milyen szűkítést
végezve, és mikor fejezik be működésüket!
?- domain([X,Y], 1, 10), X+Y #=< 10, relation(X, [4-{2},6-{2,3},8-{2,4},9-{3},10-{2,5}], Y), X-Y #> 3, indomain(Y).
2. Írj egy library(clpfd) programot az alábbi feladat
megoldására!
Az egyszerusitheto(X,Y) eljárás sorolja fel a következő tulajdonságokkal bíró (X,Y) számpárokat:
3. Definiáld FD-predikátummal (indexikálisokkal) az 'abs(x-y)=<10'(X,
Y) constraintet, amely nevének megfelelő jelentésű, és
intervallum-konzisztenciát ill -levezethetőséget biztosít! Írd meg az
FD-predikátum mind a négy klózát!
4. Írd meg a következő constraintet a
library(clpfd) segítségével! Ne használj választási pontokat
(spekulatív diszjunkciót)!
kiegyensulyozott(L): Az L listában azon pozíciók száma, amelyeken az utána levőnél nagyobb szám áll megegyezik azon pozíciók számával, amelyeken az utána levőnél kisebb szám áll.
Példa:
| ?- L=[A,B,C], domain(L, 1, 3), A+B #=4, kiegyensulyozott(L), labeling([],L), write(L), nl, fail. [1,3,1] [1,3,2] [2,2,2] [3,1,2] [3,1,3] no | ?-
This document was generated using the LaTeX2HTML translator Version 99.2beta8 (1.42)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -no_navigation -split 0 gyujtemeny
The translation was initiated by Szeredi Peter on 2003-01-13