Marton Jozsef Erno <mj492(a)hszk.bme.hu> writes:
Sziasztok,
Az vetodott fel bennem, hogy a konstanstartomanyok jelolesere hasznalt
nyelvtan nem egyertelmu. (Ugyanez a helyzet Sicstus kezikonyv 34.11.1-es
szakaszaban a ConstantRange-et leiro szaballyal).
A jegyzet 50. oldala szerint:
op(500, fy, \).
op(500, yfx, /\ ).
Namost ezek szerint ha azt irom, hogy
\ KT1 /\ KT2
akkor ez az operatorok tipusa miatt lehet
\ ( KT1 /\ KT2 ), vagy ( \ KT1 ) /\ KT2
Az a helyzet, hogy a clpfd konyvtar nem rendelkezik (nem is rendelkezhet)
sajat nyelvtani elemzovel, hanem a Prolog kifejezeselemzojere epit.
Tehat a Prolog rendszer - az ervenyben levo operatordeklaraciok alapjan -
kielemzi a klozt, amelynek belsejeben valahol van egy `X in ConstantRange'
alaku reszkifejezes. Ez az elemzes egyertelmuen lezajlik. Ezutan jon a
term- ill goal kifejtes, amely a clpfd igenyeinek megfeleloen
transzformalja a kodot.
Ennek illusztralasara egy apro pont: az idezett szintaktikus szabaly nem
szol arrol, hogy zarojelbe lehet tenni a ConstantRange tetszoleges reszet,
pedig lehet, sot celszeru, mert meglegehetosen zavarosak az
operatordeklaraciok...
A sicstus a write_canonical tanusaga szerint az utobbi
mellett dont
(termeszetesen KT[12] helyere tenylegesen egy konstanstartomanyt irva),
ami logikus is. Kiderult az is, hogy ezt a term-kifejtesnek koszonhetjuk,
ami zarojelez ugy, ahogyan azt kell.
Tovabba a term-kifejtesnek koszonheto az is, hogy irhato olyan, hogy
KT1 /\ \KT2, mert az operatorok tipusa ezt nem tenne lehetove (a \ itt
vegig a clpfd-beli, es nem a beepitett \ operator).
A fentiek fenyeben ezzel nem tudok egyeterteni (ti., hogy a
term-kifejtesnek koszonheto lenne a zarojelezes), de az is lehet, hogy csak
nem ertem, mit mondasz.
Teny az, hogy a SICStus clpfd konyvtara atdefinialja a \ operatort, ami
nagyon szerencsetlen dolog. Lehet, hogy ez is megzavart teged (engem
biztosan).
-Peter