Sziasztok!
Az első kis házi megoldása közben a következő érdekes problémába ütköztem:
a beadón lévő összes teszteset sikeres, kivéve az utolsó előttit. A
teszteset így néz ki:
[X,Y,Cin]=[1,1,0],[Sum,Cout]=[1,0],count([F1,F2,F3,F4,F5],1),sat((((F1+(U1=:=X*Cin)*F2+(U2=:=Y*U3))*F3+(Cout=:=U1+U2))*F4+(U3=:=X#Cin))*F5+(Sum=:=Y#U3)),labeling([F1,F2,F3,F4,F5]).
A beadott programom megtalálja az egyetlen helyes megoldást, viszont
emellett még felsorol néhány másikat is, mégpedig olyanokat, ahol egynél
több egyes van behelyettesítve, tehát a count([...], 1) nem teljesül.
Próbáltam kisebb példákon keresztül leszűkíteni, hogy hol lehet a hiba, de
nem sikerült olyan esetet találnom, ahol rosszul működne a count()
eljárásom (a fenti tesztesetet kivéve). Sőt: a fenti tesztesetnél, ha nem
labeling-et használok, hanem explicit behelyettesítem a változók helyére
bármelyik eredetileg számolt rossz megoldást, akkor úgy már helyesen
következtet, hogy 'no', illetve ha a count(...) hívást a labeling(...)
utánra teszem, már csak az egyetlen helyes megoldást sorolja fel.
Esetleg valaki találkozott hasonlóval, vagy van valakinek ötlete, hogy mi
okozhatja ezt a működést? Köszönöm előre is a segítséget.
Üdv,
Oláh Gergely
Egyikőtöktől kaptam egy levelet, amire való válaszomat közreadom,
remélhetően mindannyiótok okulására. Nyomj egy PageDown-t, ha meg akarod
nézni.
Péter
Úgy látom, hogy a "mindent-vagy-semmit hozzáállással" oldod meg a
feladatot: ha vannak ismeretlenek megvárjuk, hogy mindegyik
behelyettesítődjön. De ez nagyon gyenge következtetést ad. Pl. egy ilyen
hívás esetén:
| ?- sat(A*B) (*)
elvárható, hogy következtesse ki, hogy A=1, B=1.
A mininat-hoz hasonló módon azt javasolom, hogy ezt a (*) példát fordítsd
egy *(A,B,1) hívásra, és a * /3 predikátumot írd meg úgy, hogy ha a
harmadik argumentumról kiderül, hogy 1, akkor helyettesítse be az első
kettőt 1-re. (Érdemes megnézned a 39. fólán levő példát, ami a negációt
kezelő ~ /2 eljárást valósítja meg ezen elvek mentén.)
Hasonlóképpen az *(A,1,B) ébredjen fel, és egyesítse A-t B-vel (ehhez az =?
when-es ébresztés és az == azonosság-vizsgálat kell, mint a 39. fólián
szereplő ~ /2 -ben). A 40. fólia alján három további példa szerepel, hogy
milyen "következtetéseket" várhatunk el a + /3, * /3 és # /3 eljárásoktól.
Péter