Съдържание 
 

УВОДЕН ПРИМЕР

      Задача. Да предположим, че е дадено едно множество D от хора, като всеки от тях има личен лекар и въпросният личен лекар е от същото множество. Нека сред хората от D има един с име Асен и са изпълнени следните условия:
 1. Асен уважава личния си лекар.
 2. Всеки човек от D, който уважава личния си лекар, уважава и Асен.
 3. Винаги, когато един човек от D уважава даден човек от D, а също и личния си лекар, личният лекар на първия от споменатите хора уважава личния лекар на втория.
Да се посочат примери за двойки хора от D, които се уважават взаимно (допускат се и примери, когато двамата взаимноуважаващи се съвпадат, т.е. примери на хора от D, които уважават себе си).

      От условията 1 и 2 веднага следва, че Асен уважава себе си, и така получаваме един пример за двойка взаимноуважаваши се хора от D. Има обаче и много други примери. Например с използване и на условието 3 се вижда, че Асен и личният му лекар се уважават взаимно. Тъй като имаме условието 1, достатъчно е да се убедим, че личният лекар на Асен уважава Асен, а това можем да видим по следния начин. Прилагаме условието 3, като в качеството на първи човек от множеството вземаме Асен, а в качеството на втори личния лекар на Асен. Благодарение на условието 1 получаваме заключението, че личният лекар на Асен уважава своя личен лекар, а оттук с помощта на условието 2 заключаваме, че личният лекар на Асен уважава и Асен.

      Програмирането на езика Пролог дава възможност да намерим горните примери с помощта на компютърна програма. В Пролог е разрешено конкретни обекти, операции и релации да се означават например с малки латински букви, а произволни обекти    с главни. Като имаме пред вид това, ще означим Асен с латинската буква a, личния лекар на произволен човек X от D ще означаваме с g(X), а за твърдението, че лицето X уважава лицето Y, ще използваме записа r(X,Y). При тези означения условието 1 добива вида r(a,g(a)). За да запишем условията 2 и 3 по начина, приет в Пролог, ще отбележим, че той е следният: за да изразим, че едно твърдение A е вярно винаги, когато са верни дадени твърдения B1, , Bn, пишем
        A :-  B1, , Bn.
Вземайки пред вид всичко това, можем да напишем следната програма на Пролог, клаузите на която изразяват условията 1, 2 и 3:
        r(a,g(a)).
        r(X,a) :-  r(X,g(X)).
        r(g(X),g(Y)) :-  r(X,Y), r(X,g(X)).
Това пък, което се търси в задачата, е двойка хора X и Y от D, за които са верни едновременно твърденията r(X,Y) и r(Y,X). Съответният формален запис по каноните на Пролог е във вида на следното запитване:
        ? :-  r(X,Y), r(Y,X).

      Начинът, по който компютър с инсталиран на него Пролог, фактически би изпълнявал горната програма при споменатото запитване, изглежда така. Търсят се означения на обекти, които да удовлетворяват запитването, т.е. при заместването на X и Y с тези означения и двата члена на запитването да се превърнат в твърдения, които следват логически от клаузите на програмата. За целта се прави опит да се удовлетвори запитването, като се започне с удовлетворяване на първия му член r(X,Y). Най-напред се проверява дали е възможно това да стане с използване на първата от клаузите. Очевидно това може да се направи, като в запитването се заместят X и Y съответно с a и g(a) (символичното означение на това заместване е [X/a,Y/g(a)]). Така задачата се свежда до запитването
        ? :-  r(g(a),a).
Да се удовлетвори то всъщност пзначава да се покаже, че единственият му член r(g(a),a) е логическо следствие от клаузите на програмата. Единствената евентуална възможност за това е да се използва частният случай на втората клауза от програмата, получен чрез заместване на X с g(a), а това свежда въпроса до удовлетворяване на запитването
        ? :-  r(g(a),g(g(a))).
За него пък единствената евентуална възможност да го удовлетворим е да използваме частния случай на третата клауза, получен чрез заместване на X и Y съответно с a и g(a). Това свежда задачата до удовлетворяване на запитването
        ? :-  r(a,g(a)), r(a,g(a)).
Тъй като удовлетворяването му става с двукратно използване на първата клауза на програмата, можем да сме сигурни, че първоначалното запитване в крайна сметка се удовлетворява след заместването [X/a,Y/g(a)]. С други думи, получихме с помощта на формални манипулации заключението, че Асен и личният му лекар се уважават взаимно.

      Други решения на задачата можем да търсим, като се опитаме да удовлетворим първия член на първоначалното запитване с помощта на втората или на третата клауза.За удовлетворяване с помощта на втората клауза можем да разгледаме частния случай на запитването, получен чрез заместването на Y с a. Това свежда задачата до удовлетворяване на запитването
        ? :-  r(X,g(X)), r(a,X).
Частният му случай, получен чрез заместване на X с a, има пръв член, който се удовлетворява въз основа на първата клауза, и значи задачата се свежда до удовлетворяване на запитването
        ? :-  r(a,a).
Неговото удовлетворяване би могло да стане само чрез използване на частния случай на втората клауза, получен чрез заместване на X с a, и тогава задачата се свежда до удовлетворяване на запитването
        ? :-  r(a,g(a)).
Това разбира се става чрез използване на първата клауза. В крайна сметка първоначалното запитване се оказа удовлетворено след заместването [X/a,Y/a]). И така, получихме с формални манипулации и заключението, че Асен уважава себе си.

      Продължавайки в същия дух, можем да опитаме да удовлетворим другояче разглежданото по-горе запитване
        ? :- r(X,g(X)), r(a,X).
Това може да стане с използване на третата клауза, ако разгледаме частния случай на запитването, получен при заместване на X с g(X). Оказва се обаче, че по този начин ще успеем да удовлетворим само частния случай на първоначалното запитване, получен чрез заместването [X/g(a),Y/a]), а това пак отговаря на взаимното уважаване на Асен и личния му лекар. Решенията на задачата съвсем не се изчерпват със споменатите дотук, но директното използване на Пролог за съжаление дава само тях. Засега няма да се занимаваме с въпроса как бихме могли да получаваме и другите решения.

Последно изменение: 10.03.2009 г.