Kedves Laci, kedves mindnyajan!
László Nikházy <niklaci(a)hotmail.com> writes:
Foglalkoztam kicsit az elsõ kisházival (a clp(MiniB)
megvalósításával),
Nagyon jo, nagyon orulok!
és lenne pár kérdésem, fõleg azzal kapcsolatban, hogy
mit kell
tudnia. Most elsõ körben a clp(MiniNat) példájára megcsináltam azt, hogy
a kifejezést felbontja mûveletenként célokra, és aztán azokat meghívja.
Felraktam a
http://www.cs.bme.hu/~szeredi/nlp/ honlapra a kishazi kiirasat
(ugyanaz mint a kiosztott foliamasolatokon), plusz egy kiegeszitest;
tovabba a csak futtathato mintamegvalositast. Ezekben (ill. a mintamegoldas
segitsegevel) a kerdeseid jo reszere valaszt kaphatsz, de azert ebben a
levelben is valaszolok.
De pl. egy sat(A*B =:= A*B) esetén elõször ugye a
célsorozat valahogy így
néz ki: =:=(C,D,1), *(A,B,C), *(A,B,D). Aztán az elsõbõl kitalálja, hogy
C=D, de maradnak ilyesmi felfüggesztett célok, hogy: *(A,B,C),
*(A,B,C). És ugye a végeredmény szempontjából teljesen mindegy, hogy mi a
behelyettesítés, ezért úgy érzem, hogy "true"-t kellene válaszolnia.
Idealisan ezt tenne, es a clpb konyvtar azt is teszi. De ahogyan a foliakon
szereplo mininat megvalositas sem true-val valaszol az | ?- {X+Y=X+Y}
kerdesre, hanem ket felfuggesztett cellal, ez a viselkedes (tehat a
felfuggesztett celok jelenlete) teljesen elfogadhato a minib-ben is.
Hasonló helyzet van egy sat(A + ~A)-val, itt a
jelenlegi vagy-om nem
látja azt, hogy a kettõ közül legalább az egyik 1-es, és vár arra, hogy
behelyettesítõdjön az A.
Igen, ez is elfogadhato.
Az a kérdésem, hogy ilyeneket tudnia kell megoldani a
sat-nak, és ha
igen, akkor kaphatnék-e egy kis segítséget, hogy hogy érdemes csinálni.
Mivel most nem egy "igazi" sat megoldo a cel, hanem a korutinszervezes
gyakorlasa, ezert ilyeneket nem kell a sat-nak eszrevennie.
Még az nem világos, hogy a count-nak mit kell tudni.
Pl. kell olyat
figyelnie, hogy a listában milyen behelyettesített értékek vannak már,
és hogy akkor a maradék kitöltése már egyértelmû?
Igen.
Mondjuk egy
count([A,B,0,C,0,1],4) esetén ugye egyértelmû, hogy A=B=C=1, de a
jelenlegi programom ezt nem látja.
Ezen javits...
Még bonyolultabb az eset mondjuk egy
count([A,A,0,B,0,1],3) esetén. Ezekbõl mit kell tudnia a programnak?
Ezt nem kell tudnia, azaz count-nak nem kell foglalkoznia a valtozok
azonossaganak vizsgalataval. Alabb beidezem a honlaprol is elerheto
"kiegeszites"-t, amely pontosan megmondja, mit kell tudnia a count-nak:
-Peter
Kiegészítés a count/2-höz
=========================
A count/2 predikátummal szemben elvárás:
a. ne csináljon választási pontot (lásd a 4. futási példát a fólián).
b. 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.
c. 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.