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
Show replies by date