Съдържание 
 

ПРОПАДАЩИ И УСПЯВАЩИ ХОРНОВИ ЗАПИТВАНИЯ ПРИ ДАДЕНА ХОРНОВА ПРОГРАМА

    Нека P е хорнова програма. Едно хорново запитване Q ще наричаме пропадащо при P, ако всевъзможните канонични резолвентни редици относно P, започващи с Q, са краен брой и никоя от тях не завършва с празното запитване.

    Пример 1. Нека P е програмата от пример 1 във въпроса Хорнови програми, т.е. програмата
a(o,Y,Y).
a(s(X),Y,s(Z)) :- a(X,Y,Z).
m(o,Y,o).
m(s(X),Y,Z) :- m(X,Y,U), a(U,Y,Z).
Ще покажем, че следното запитване е пропадащо при P:

?- a(X,Y,s(s(o))), m(X,Y,s(s(o))).
Да означим това запитване с Q. Да се условим освен това, когато едно хорново запитване и дадена клауза от P имат резолвента, да означаваме каноничната им резолвента, като след означението на запитването поставим точка и поредния номер 1, 2, 3 или 4 на клаузата. Търсенето на всички канонични резолвентни редици относно P, които започват с Q, ще извършим, като започнем последователно да намираме техните членове, следвайки ред на действията, отговарящ на операционната семантика на Пролог. За прегледност ще опишем това търсене, служейки си с току-що въведените означения. А именно, след всеки ред с такова означение (използвано подчертано) ще следват ред, на който е записано как всъщност изглежда въпросното хорново запитване, и ред, на който е посочено с кои клаузи от P то има резолвента. Когато в записа на това запитване участват гръцки букви (евентуално с индекси), ще считаме, че те означават променливи, като означените по различен начин променливи в един такъв запис ще считаме за различни (конкретният избор на променливите може да зависи от уславянето коя от най-общите резолвенти се приема за канонична). Клаузите от P, с които запитването има резолвента, ще посочваме чрез изброяване на техните поредни номера, като липсата на такива клаузи ще посочваме посредством знак минус.
Q
?- a(X,Y,s(s(o))), m(X,Y,s(s(o))).
    1, 2
Q.1
?- m(o,s(s(o)),s(s(o))).
   
Q.2
?- a(ξ,η,s(o)), m(s(ξ),η,s(s(o))).
    1, 2
Q.2.1
?- m(s(o),s(o),s(s(o))).
    4
Q.2.1.4
?- m(o,s(o),υ), a(υ,s(o),s(s(o))).
    3
Q.2.1.4.3
?- a(o,s(o),s(s(o))).
   
Q.2.2
?- a(ξ1,η1,o), m(s(s(ξ1)),η1,s(s(o))).
    1
Q.2.2.1
?- m(s(s(o)),o,s(s(o))).
    4
Q.2.2.1.4
?- m(s(o),o,υ1), a(υ1,o,s(s(o))).
    4
Q.2.2.1.4.4
?- m(o,o,υ3), a(υ3,o,υ2), a(υ2,o,s(s(o))).
    3
Q.2.2.1.4.4.3
?- a(o,o,υ4), a(υ4,o,s(s(o))).
    1
Q.2.2.1.4.4.3.1
?- a(o,o,s(s(o))).
   

    Забележка 1. Можем да онагледим извършеното в горния пример с помощта на следната дървовидна схема:

  Q    
                    
Q.1   Q.2  
     
  Q.2.1   Q.2.2
     
  Q.2.1.4   Q.2.2.1
     
  Q.2.1.4.3   Q.2.2.1.4
      
      Q.2.2.1.4.4
      
      Q.2.2.1.4.4.3
      
      Q.2.2.1.4.4.3.1

    Забележка 2. Заключението, че запитването от пример 1 е пропадащо при програмата от този пример, очевидно не зависи от конкретния избор на каноничните резолвенти сред най-общите. Може да се покаже, че подобна независимост е налице винаги, а именно, ако при някой конкретен избор на каноничните резолвенти сред най-общите едно хорново запитване се окаже пропадащо, то ще бъде пропадащо и при всеки друг техен избор.

    Забележка 3. При софтуерните реализации на езика Пролог е предвидено изпълнението на хорнова програма върху пропадащо хорново запитване да завършва със съобщение (обикновено то е думата No), показващо, че запитването е пропадащо (по-точно, до такова съобщение се стига при допълнителното условие ресурсите на компютъра да са достатъчни за изследването на всички канонични резолвентни редици относно дадената програма, които започват с даденото запитване).

    Забележка 4. От пълнотата на SLD-резолюцията е ясно, че когато едно хорново запитване е пропадащо при дадена хорнова програма, не може да съществува отговор на това запитване при тази програма в смисъла на дефиницията от въпроса Хорнови програми. Обратното обаче не е в сила. Например нека p и q са нулместни предикатни символи, а P е хорновата програма
p :- q.
q :- p.
Нека Q е хорновото запитване

?- p.
Тогава не съществува отговор на Q при P (защото има модел за P, в който атомарната формула p не е вярна), но Q не е пропадащо при P (защото съществуват произволно дълги резолвентни редици относно P, започващи с Q). Като по-интересен пример в същата насока можем при програмата от пример 1 да разгледаме хорновото запитване
?- r(X,o,s(X)).
То няма отговор при споменатата програма,тъй като съществува модел за нея, в който атомарната формула r(X,o,s(X)) не е изпълнима. От друга страна то има резолвента с втората клауза на програмата и каноничната му резолвента с нея е запитване от същия вид, но евентуално с друга променлива. Поради това съществуват произволно дълги канонични резолвентни редици, започващи с разглежданото запитване.

    Знаем, че съществуването на отговор на дадено хорново запитване при дадена хорнова програма не гарантира намирането на такъв отговор при търсенето му съобразно с операционната семантика на Пролог. Ще дадем една математическа характеризация на случаите, когато споменатият вид търсене би дал отговор след някакъв брой стъпки.

    Нека P е дадена хорнова програма. На някои хорнови запитвания ще съпоставим число от двуелементното множество {0,1}, като числото, съответно на дадено хорново запитване Q, ще наричаме успех на Q при P или по-кратко успех на Q. Начинът на съпоставянето ще опишем чрез следната индуктивна дефиниция:
     1. Празното запитване има успех 1.
     2. Ако всички канонични резолвенти на дадено непразно хорново запитване Q с клаузи на P имат успех 0 (в частност, ако Q няма резолвента с никоя клауза на P), то Q има успех 0.
     3. Ако всички канонични резолвенти на дадено непразно хорново запитване Q с клаузи на програмата P, предхождащи дадена нейна клауза C, имат успех 0 (в частност, ако Q няма резолвента с никоя клауза на P, предхождаща C), а с C запитването Q има канонична резолвента с успех 1, то Q има успех 1.

    Пример 2. Всички запитвания, за които става дума в пример 1, имат успех 0 при програмата, разглеждана там. И наистина, по точка 2 от горната дефиниция всяко от запитванията Q.1, Q.2.1.4.3 и Q.2.2.1.4.4.3.1 има успех 0. Прилагайки отново същата точка от дефиницията, заключаваме последователно, че такъв успех има също всяко от запитванията Q.2.1.4 и Q.2.1, както и всяко от запитванията Q.2.2.1.4.4.3, Q.2.2.1.4.4, Q.2.2.1.4, Q.2.2.1, Q.2.2. Като използшаме това, че всякп от запитванията Q.2.1 и Q.2.2 има успех 0, пак по точка 2 получаваме, че и запитването Q.2 има успех 0. Имайки по такъв начин информацията, че всяко от запитванията Q.1 и Q.2 има успех 0, заключаваме по същата точка, че и запитването Q има успех 0.

    Пример 3. Нека P е същата програма както в пример 1, но Q да е запитването

?- a(X,Y,s(s(o))), m(X,Y,s(o)).
Като използваме означения както във въпросния пример и работим по аналогичен начин, получаваме:
Q
?- a(X,Y,s(s(o))), m(X,Y,s(o)).
    1, 2
Q.1
?- m(o,s(s(o)),s(o)).
   
Q.2
?- a(ξ,η,s(o)), m(s(ξ),η,s(o)).
    1, 2
Q.2.1
?- m(s(o),s(o),s(o)).
    4
Q.2.1.4
?- m(o,s(o),υ), a(υ,s(o),s(o)).
    3
Q.2.1.4.3
?- a(o,s(o),s(o)).
    1
Q.2.1.4.3.1
?- .
   
(понеже стигнахме до празно запитване, спираме дотук с резолюциите и не се занимаваме с Q.2.2). По точка 1 от дефиницията за успех запитването Q.2.1.4.3.1 има успех 1, а оттук по точка 3 на същата дефиниция получаваме последователно, че такъв успех имат и запитванията Q.2.1.4.3, Q.2.1.4, Q.2.1, Q.2. По точка 2 пък запитването Q.1 има успех 0. Прилагайки още един път точка 3, заключаваме, че запитването Q има успех 1.

    Забележка 5. Може да се покаже, че ако при даден конкретен избор на каноничните резолвенти сред най-общите едно число се е оказало успех на дадено хорново запитване при дадена хорнова програма, то това положение на нещата ще бъде налице и при всеки друг избор на каноничните резолвенти сред най-общите.

    Твърдение 1. Когато едно хорново запитване Q има успех s при дадена хорнова програма P, в сила са следните две условни твърдения:
     а) ако s=0, то Q е пропадащо при P;
     б) ако s=1, то съществува канонична резолвентна редица относно P, която започва с Q и завършва с празно запитване.

    Доказателство. Използваме индукция, съобразена с индуктивната дефиниция за успех, и следните три твърдения, от които първото е тривиално, а останалите две са лесно проверими:
     1. Едночленната редица, на която единствен член е празното запитване, е канонична резолвентна редица относно P.
     2. Ако всички канонични резолвенти на дадено непразно хорново запитване Q с клаузи на P са пропадащи при P (в частност, ако Q няма резолвента с никоя клауза на P), то Q е пропадащо при P.
     3. Ако дадено непразно хорново запитване Q има с някоя клауза на програмата P канонична резолвента, която е начален член на канонична резолвентна редица относно P, завършваща с празно запитване, то съществува канонична резолвентна редица относно P, която започва с Q и завършва с празно запитване.  

    От твърдение 1 е ясно, че не може едно хорново запитване да има при дадена хорнова програма едновременно успех 0 и успех 1, но може да се случи то да няма нито успех 0, нито успех 1 (защото може да се случи каноничните резолвентни редици, започващи с даденото запитване, да са безбройно много, но никоя от тях да не завършва с празното запитване.

    Твърдение 2. Нека P е произволна хорнова програма. Ако едно хорново запитване е пропадащо при програмата P, то това запитване има при нея успех 0.

    Доказателство. Използваме индукция относно максималната измежду дължините на каноничните резолвентни редици относно P, започващи с даденото пропадащо запитване (този брой е поне 1 и запитването не е празно). Ако тази максимална дължина е 1, то запитването няма резолвента с никоя клауза на P и следователно има успех 0 (по точка 2 от дефиницията за успех). Да предположим сега, че при дадено положително цяло число n всяко пропадащо при P хорново запитване, с което не започват канонични резолвентни редици относно P с повече от n члена, има успех 0 при P. Нека Q е такова пропадащо при P хорново запитване, че най-дългата канонична резолвентна редица относно P, започваща с Q, е n+1-членна. Тогава всяка канонична резолвента на Q с клауза на P ще има успех 0 при P, тъй като от такава резолвента не започват канонични резолвентни редици относно P с повече от n члена. При това положение точка 2 от дефиницията за успех позволява да заключим, че и Q има успех 0 при P.  

    Следствие. Едно хорново запитване има успех 0 при дадена хорнова програма точно тогава, когато то е пропадащо при нея.

    Както видяхме в твърдение 1, ако едно хорново запитване има успех 1 при дадена хорнова програма, то съществува канонична резолвентна редица относно нея, започваща с даденото запитване и завършваща с празното запитване, Обратното не винаги е вярно. При по-прецизно описание на операционната семантика на Пролог, включващо в частност връщанията назад при невъзможност да се продължи дадена резолвентна редица, може да се покаже, че успех 1 при една хорнова програма имат точно онези хорнови запитвания, за които операционната семантика осигурява намирането на отговор при програмата (поне ако се абстрахираме от ограничеността на ресурсите на компютъра). Хорновите запитвания, които имат успех 1 при дадена хорнова програма P, ще наричаме успяващи при P. Всеки конкретен пример, показващ непълнотата на операционната семантика на Пролог относно хорнови програми и хорнови запитвания, може да послужи като пример за хорново запитване, което има отговор при дадена хорнова програма, но не е успяващо при нея.

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