Szabados Péter <peet21(a)freestart.hu> writes:
A következõ kérdésem lenne. Megírtam a sat
eljárást, ami helyes
eredményt ad, de választási pontot hoz létre, és kidobja az
eredményeket akkor is, amikor nem kéne. A probléma a következõ
eljárással van (a MiniNat szorzatuk_nulla eljárásának mintájára
írtam):
%and2(A, B, C): C=A és B, C ismert.
and2(A, B, C) :-
( C=1 -> (A=1, B=1)
; (A=0; dif(A, 0), B=0)
).
Érthetõ, hogy ez így nem jó, a diszjunkció miatt. A kérdésem
az, hogy hogyan lehet ezt megvalósítai úgy, hogy azt csinálja, amit
kell?
Nem igazan tudom ertelmezni a fejkommentet.
Egy lehetseges ertelmezes, hogy az and2/3 predikatum csak akkor hivodik meg
ha B, C mar ismert es C = A is igaz, es feladata -- a predikatum nevebol
fakadoan -- az A*B=C biztositasa.
Ez esetben a meghivaskor mar mindharom argumentum ismert, es az eljarasnak
csak el kell dontenie, hogy a predikatum igaz-e vagy sem. A fenti megoldas
ezt meg is teszi, egyetlen csunyasaga, hogy ha A=0, akkor hagy egy
valasztasi pontot (de nem sikerul ketszer a dif miatt). Ugyanakkor a dif-es
ag soha nem sikerulhet, mert ha A = 1, akkor C = 1 is igaz, es az elso agon
fut le a kod. Tehat valami ilyesmi a jo.
% and2(A, B, C): C=A és B, C ismert.
and2(A, B, C) :-
( C=1 -> B=1 % A=1 biztos igaz, C=A miatt
; A=0 -> true % C=0 biztos igaz, C=A miatt
).
Gondolom te maskepp ertelmezted a fejkommentet. Ha tisztazod, es azt is
megmondod milyen "rossz eredményeket dob ki", akkor megprobalok segiteni.
Valóban, a fejkommentet úgy kellett volna írni, hogy
% and2(A, B, C): (C=A/\B), C ismert.
Így talán érthetőbb. Az eljárás azt csinálja, hogy C ismeretében
eldönti, hogy mik lehetnek A és B értékei. A következő megoldást
választottam.
and2(A, B, C) :-
( C=1 -> (A=1, B=1)
; (when((ground(A); ground(B); ?=(A, B)),
and(A, B, C)
))).