Mostanáig Prologgal küzdöttem, most pedig nekiláttam az SML-nek.
Egyelőre nem sok sikerrel. Azt hiszem, ott rontom el, hogy nem tudok
elszakadni a prologos megközelítéstől. Prologban a lepeget(...)
eljárás megírásakor a member(...) eljárást felhasználhattam arra,
hogy egy ténylegesen lépegető algoritmussal az összes lehetséges pontba
ellépjek. Ennek a megoldásnak mind külön ágai voltak. SML-ben ugyan
alkalmazhatok egy függvényt egy lista minden elemére (pl. map-et),
de annak az eredményei egy listában jönnek létre, nem pedig mint önálló
elágazások.
25.1. Válasz.
Oktató: Ajánlom figyelmébe a Prolog-jegyzet 4.5. alfejezetét
(Megoldások gyűjtése és felsorolása). Ott láthat egy semát
arra, hogyan lehet felsoroló eljárást gyűjtőve átalakítani a Prologban.
Persze ehhez tényleg át kell alakítania a programja szerkezetét, tehát
nem használhatja a member-t és más beépített eljárásokat a
felsorolásra. Ezek helyett egy
kovetkezo(+V0, +Param, -E, -V)
eljárást kell írnia, amelynek a bemenő paraméterei a kövekezők:
V0 a keresés állapotát leíró Prolog kifejezés,
Param valamilyen, a keresés során nem változó paraméter;
a kimenők pedig:
E a következő megoldás,
V a keresés új állapota.
Ha egy ilyen segédeljárásra építve oldja meg a feladatot Prologban, akkor
ezt a megoldást könnyen át tudja ültetni SML-be is.
25.2. Kérdés.
Meg tudna mondani valaki, hogy az SML-ben hogyan lehet lekérdezni egy
értékről, hogy változó-e? A prologos var(X) megfelelőjére
gondolok.
25.2. Válasz.
Oktató: Az SML-ben a változónak mindig van értéke, tehát a Prolog
var(X) vizsgálat megfelelője mindig meghiúsulna, ha lenne: ezért
nincs is ilyen vizsgálat).
A hagyományos funkcionális nyelvek, mint pl. az SML, nem
ismerik a logikai változó fogalmát, de az újabb funkcionális
nyelvekben (pl. Oz, Alice) megjelenik ez a nyelvi elem
is.