"Buza, Krisztian" <chrisbuza(a)yahoo.com> writes:
Sziasztok!
Az elso kishazi megoldasahoz lenne szuksegem segitsegre.
Addig szepen mukodik a program, hogy egyetlen formula
kielegithetoseget illetve az ehhez szukseges behelyettesiteseket
megadja.
A gondom olyan esetben van, amikor
sat(..formula1..), sat(..formula2..) ...
alaku kerdeseket teszunk fel. Valahogy ugy tunik, hogy a formula1 es
formula2 valtozoit belso abrazolasban mas-mas nevvel latja el. (Tehat
pl. formula1-beli A-bol _409 lesz, formula2-belibol pedig _4312.)
Azt hiszem itt felreertesrol van szo. Amikor ket valtozot egyesitunk, akkor
az egyik neve muszaj, hogy "megvaltozzek", hiszen a masikkal lesz azonos.
Valami hasonlo tortenik akkor is, amikor egy valtozora vonatkozoan
felfuggesztunk egy celt (pl. freeze vagy :- block segitsegevel), ilyenkor a
nyomkovetes altal kiirt valtozonev uj lesz, de ez nem jelenti azt, hogy a
valtozo tenylegesen megvaltozott.
Az alabbi egyszeru program illusztralja ezt:
p(X,Y) :- freeze(X, Y=X).
q :-
p(X, A),
p(X, B),
X=1,
write([A,B,X]),
nl.
| ?- trace, q.
1 1 Call: q ?
2 2 Call: p(_1001,_1002) ?
- - Block: freeze(_1483,user:(_1002=_1483)) %%%% _1001-bol _1483 lett
2 2 Exit: p(_1483,_1002) ?
3 2 Call: p(_1483,_1975) ?
- - Block: freeze(_2456,user:(_1975=_2456)) %%%% _1483-bol _2456 lett
3 2 Exit: p(_2456,_1975) ?
- - Unblock: prolog:freeze__int(1,user:(_1002=1))
4 2 Call: _1002=1 ?
4 2 Exit: 1=1 ?
- - Unblock: prolog:freeze__int(1,user:(_1975=1))
5 2 Call: _1975=1 ?
5 2 Exit: 1=1 ?
6 2 Call: nl ? [1,1,1]
6 2 Exit: nl ?
1 1 Exit: q ?
yes
A konkluzio az, hogy a valtozonevek megvaltozasa egy felrevezeto jelenseg,
de attol meg az azonos valtozok azonosak maradnak. A programodban levo
hibat (ha egyaltalan van), masutt kell keresned.
-Peter