Prolog logikai programozási

A leírás, ez állítmány abban a részében, a program célja, akkor a szerkezet:

show: - kutyák (X), print_list (X).

Ha azt szeretnénk, hogy fennállásának egy elem a listában, akkor a szabály vonatkozik:

find_it (X, [_ | Y]): - find_it (X, [Y]).

Az első leírása összehasonlítás keresett elemet, és a fejét a listán. Amennyiben ez az összehasonlítás sikertelen, a tranzakciót vissza, és megpróbálja megismételve a második kiviteli alakban.

Predikátumok kutyák (dog_list). find_it (szimbólum, dog_list).

find_it ( «Bichon "[ "szereti"," kutya»]), írás ( "igen"). ZÁRADÉKOK

Az első szabály egy olyan helyzetet, ahol a szükséges elem X egybeesik a lista élére.

A második szabály használják a nem-siker az első szabály, és leírja az új kihívás az első szabály, hanem egy csonka listát, amely nem rendelkezik az első elem, stb Ha nincs elem a listán (az üres lista), akkor a második szabály nem volt sikeres.

A program kiírja Igen, mert nincs öleb a kutya listán.

A következő példa számít az összeg az összes elemet a lista számokat.

summa_sp ([H | T], S): - summa_sp (T, S1), S = H + S1.

Tekintsük a két lista egyesítése működését.

Hagyja, L1 és L2 - két változó képviselő bemenő listákat. L3 - Output lista kapott egyesítés L1 és L2.

hozzáfűzése ([N | L1], L2, [N | L3]): - append (L1, L2, L3).

Az első változat a szabály hajtódik végre, ha az első lista üres, a második a munka más esetekben.

Tekintsük az ezzel állítmány a következő hívást:

Itt az első változata a szabályok nem működik az első, mert az első lista nem üres.

Úgy kezdődik a második szabály, mint a harmadik lista üres, akkor nem alkalmazható az osztás a fej és a farok. Ami az első listát, akkor a folyamat rekurzív hívások osztódásnak egy fej és egy farok, és végül kiürül (elemei tartoznak a stack)

Ez után váltja az első változata a szabályokat, és a harmadik lista inicializálja a második:

Végül, a teljes rekurzív hívások, PROLOG kivonatokat a verem (fordított sorrendben) elemeit az első lista, és visszaadja azt a leírással összhangban a második kiviteli alak szabályok listák 1 és 3:

Gondold át, hogyan kell használni a listákat és a mechanizmus a rekurzió a megoldás a híres probléma a paraszt, a farkas, a kecske és a káposzta.

go (állami (keleti, kelet, keleti, keleti), állam (nyugati, nyugati, nyugati, nyugati)), írás ( "megoldotta nyomjon meg egy gombot a folytatáshoz"),

path (S, G, [S], L), NL, levelet ( "A megoldás:"), nl, write_path (L),

path (S, G, L, L1): - lépés (S, S1), és nem (nem biztonságos (S1)), sem (tag (S1, L)), útvonal (S1, G, [S1 | L], L1 ).

path (G, G, T, T): -. / * Végső állapot eredménye, L lista másolódik a L1 * / lépés (State (X, X, G, C), állapot (Y, Y, G, C)): - ellenkező (X, Y). / * És az ember Wolf * / lépés (State (X, W, X, C), állapot (Y, W, Y, C)): - ellenkező (X, Y). / * Ember és kecske * / lépés (State (X, W, G, X), állapot (Y, W, G, Y)): - ellenkező (X, Y). / * Ember és káposzta * / lépés (State (X, W, G, C), állapot (Y, W, G, C)): - ellenkező (X, Y). / * Egy * az ember /

szemben (nyugatra, keletre): -. / * Leírás ellentétes oldalán * /

nem biztonságos (állami (F, X, X, _)): - ellenkező (F, X)

/ * * Wolf eszik kecske /

nem biztonságos (állami (F, _, X, X)): - ellenkező (F, X).

/ * * Kecske eszik káposzta /

tagja (X, [_ | L]): - tagja (X, L) / * állapotának ellenőrzése, amely már * /

readchar (_), write_move (H1, H2), write_path ([H2 | T]). write_path ([]).

write_move (állami (X, W, G, C), állapot (Y, W, G, C)): -. write ( "egy ember átlép egy folyó" X "a" Y), nl. write_move (állami (X, X, G, C), állapot (Y, Y, G, C)): -. write ( "Egy ember hordozza a farkas", X, "partra", Y), nl. write_move (állami (X, W, X, C), állapot (Y, W, Y, C)): -. write ( "Egy ember hordozza a kecske" X "partra", Y), nl. write_move (állami (X, W, G, X), állapot (Y, W, G, Y)): -. write ( "Egy ember hordozza káposztával" X "partra", Y), nl.

8. Döntés logikai rejtvények

Az a képesség, hogy leírja a logikai problémák a legsúlyosabb mellékhatások prológ.

Sok társított logikai feladatok a figyelmet a számos véges halmazok azonos számú elemet, amelyek között van egy-az-egyhez megfeleltetés. Prolog ezeket meg is lehet leírni, mint egy adatbázis és objektumok közötti kapcsolatokat készlet segítségével szabályokat.

Vegyünk egy egyszerű logikai probléma. például:

„A kerékpáros versenyek első három hely készítette Alyosha, Péter és Nick. Mi történt mindegyikük, ha nem Péter lett a második és a harmadik helyen nem, és Kohl - nem a harmadik? "

A probléma megoldása az, hogy létrehozza a kapcsolatot a sportolók és a helyeket, hogy lehet leírni táblázat. 2 (kötőjelek jelzik információk ismert):

Amikor leírja ezt a problémát prológus meghozta a következő programot.

Predikátumok neve (jel) mesto (szimbólum) prizer (szimbólum, szimbólum)

neve (Alex). neve (móló). neve (nike). Mesto (Odin). Mesto (DVA). Mesto (tri).

prizer (X, Y): - neve (X), Mesto (Y), X = Pier, nem (Y = DVA), nem (Y = tri); neve (X), Mesto (Y), X = nike, nem (Y = tri); neve (X), Mesto (Y), és nem (X = Pier), nem (X = nike). oldatot (X1, Y1, X2, Y2, X3, Y3): - neve (X1), nevét (X2), nevét (X3),

Mesto (Y1), Mesto (Y2), Mesto (Y3), prizer (X1, Y1), prizer (X2, Y2), prizer (X3, Y3), Y1<>Y2, Y2<>Y3, Y1<>Y3, X1<>X2, X2<>X3, X1<>X3.

Természetesen ez a példa a táblázat használata, így a megoldás. Azonban a bonyolultabb esetekben a táblázatok válnak többdimenziós. Nézzük meg egy másik példát - a logikai probléma ( „Tudomány és Élet” №3 1968.):

„Öt diákok kerékpárral.

Nevük jelentése Sergey, Boris, Leonyid, Gregory és Victor.

Kerékpár készült öt városban: Riga, Penza, Lvov, Harkov és Moszkva.

Mind a diákok született egy ilyen városban, de egyik sem a diákok a biciklizés, tette hazájában.

Sergey lovagol egy kerékpár készült Riga. Boris jégverés Riga, van egy kerékpár Penza.

Victor egy kerékpár Moszkvából.

Gregory kerékpárt Harkov. Victor jégverés a városban.

A natív Penza lovagol egy kerékpár által Leonid haza. Hány diák érkezik Moszkvából? „Ahhoz, hogy megoldja ezt a problémát, akkor azt a következő pro-

Tekintsük a tények leírása és a szabályokat ebben a programban.

Az első két szabály írja le a lehetséges korlátozások az értékeket és a hallgatói gorod predikátumok. Meg kell végezni a megengedhető helyettesítések megoldást találjanak.

A tények azt mutatják, három év alatti leírni az ismert adatokat nekünk, ahol a motorok készülnek néhány diák.

4. ábra jelzi általánosan leírja a kerékpár tartozó egy bizonyos tanuló. Általában két alternatív alkatrészek, elválasztva „;”. Az első rész a szabály azt mondja, hogy a hallgató X Y kerékpár, ha tudjuk, hogy ezt a tényt. A második rész a szabály lehetővé teszi, hogy bármilyen cserét, ha nem mond ellent az ismert tényeket. Állítmány nyírás! „” Itt megáll a keresés az új lehetőségeket, ha bizonyított, hogy az összes feltétel, hogy megelőzte. Ez a művelet a vágás.

5. ábra kijelölt ismert tényeket a születési hely a diákok.

6. ábra ismerteti az elképzelést a hallgatók, akik lehet a natív Penza. Ez nem lehet, vagy Boris, Victor, mert tudjuk, hogy születtek más városokban, és hogy egy diák, egy kerékpár kerül a Leonidas haza.

Amely négy részből áll a 7. cikk leírja az általános elképzelést, hogy a hazájában az egyes hallgatók. Először is, lehet, hogy egy ismert tény, és megfontolja, más lehetőség nem szükséges. A második rész ismerteti a szabályokat, aki születni Penza. A harmadik rész ismerteti a szabályokat egy esetleges születési hely, Leonyid. Végül, a negyedik része a szabályhoz, amit városi, továbbá a Penza, lehetnek diákok, de Leonidas. A jelen szoftver letöltésével, akkor kap a kívánt megoldást.

Az egyik leggyakoribb gyakorlati problémák a probléma a beosztása. Tekintsük a példát egy hasonló probléma (melyet a magazin „Tudomány és Élet”):

„Öt diák köteles részt venni előadások minden héten, de bizonyos szabályokat, nevezetesen:

1. Ha jött Andrei és Dimitrij, majd Boris nem kell, de ha Dmitriy nem jön, akkor Boris legyen, és ne legyen Victor.

2. Amikor Victor jött, akkor Andrew nem kell, és fordítva.

3. Ha Dmitry jött, majd Gregory nem kellene.

4. Ha Boris nem Dmitri kell, de ha van is a Victor, és ha van, Victor Dmitry nem lehet, de kell Gregory.

5. Minden nap, a diákok kell jönnie különböző kombinációkban. Mi az a kombináció? "

A program is fel lehet ajánlani, hogy ezt a problémát:

st_A (ek) st_D (ek) st_B (ek) st_V (ek) st_G (ek) ogr1 (s, s, s, s, s) ogr2 (S, S, S, S, S) spisok (s, s, s, s, s)

NORM1 (s, s, s, s, s) NORM2 (S, S, S, S, S) norm3 (S, S, S, S, S) norm4 (S, S, S, S, S)

ZÁRADÉKOK st_A (A): - A = Andre; A = net.

st_D (D): - D = Dmitri; D = net. st_B (B): - B = Boris; B = net. st_V (V): - V = Victor; V = net. st_G (G): - G = Grig; G = net.

ogr1 (Andre, _, _, net, _). ogr1 (nettó, _, _, győztes, _). ogr2 (_, Dmitri, _, _, nettó). ogr2 (_, net, _, _, _).

st_A (A), st_D (D), st_B (B), st_V (V), st_G (G), és nem (NORM1 (A, D, B, V, G)), sem (NORM2 (A, D, B , V, G)), sem (norm3 (A, D, B, V, G)), sem (norm4 (A, D, B, V, G)), ogr1 (A, D, B, V, G ), ogr2 (A, D, B, V, G).

Ez talán formálhatjuk elegánsabb szoftver megoldás, mint a fenti. Amikor a keresést az olvasó biztos lehet abban, hogy az ilyen esetekben nagyon fontos a választás predikátumok és szabályokat, amelyek lehet meghatározni, nem egyedülálló. Ha rossz választás szabályait nyerhető hamis megoldásokat, vagy a kipufogó rendszer erőforrásait kezelése során egymásba egy szabály a másikra.

9. adatbázisok és tudás Prolog

A leírt tények kikötések szakaszban lehet tekinteni, mint a statikus adatbázis (DB). Ezek a tények egy részét a program kódot, és nem lehet változtatni gyorsan. szakosztállyá adatbázis áll rendelkezésre, hogy hozzon létre egy dinamikus adatbázis a prológ.

Predikátumok ebben a részben azonos lehet a megjelenési formára, mint az állandó rész Prolog programok, de kell egy másik nevet.

Tekintsünk egy egyszerű példát.

name = szimbólum Rost, ves = egész

dplayer (név, Rost, ves) predikátumok

játékos (név, Rost, ves) ZÁRADÉKOK

játékos ( "Mikhailov", 180, 87) játékos ( "Smith", 187, 93) játékos ( "Harlamoff", 177, 80)

Tegyük fel, hogy van szüksége, miután a program könnyíti meg az adatok statikus és dinamikus adatbázis. Ez lehet leírni a következő szabály szerint:

assert_database: -player (N, R, V), assertz (dplayer (N, R, V)), nem.

Ez a szabály beépített predikátum assertz, amely helyére teszi a nyilatkozatot, az adatbázis minden olyan kijelentéseket, amelyek már ott van. Vannak még beépített predikátumok eltávolítására a nyilatkozatok (visszahúzódik), olvasni a lemezről (forduljon), az adatbázis a lemezre (mentése), és gyűjtsük össze az adatokat az adatbázisból a listán (findAll).

A fő előnye az adatbázist a prológ, mint bármely más adatbázis, az a képesség, hogy gyorsan információhoz való hozzáférés szelektíven. Például a fenti példában ez lehet egy kérés:

CÉL: játékos (N, R, V), R> 180

Ha összehasonlítjuk az alapfogalmak a relációs adatbázisok és a prológ, megkapjuk a következő 4. táblázat.