Лекция 16. Управление вычислениями логических программ. Оператор отсечения (1161908), страница 3
Текст из файла (страница 3)
?R(b) t6?t?t?Q(V ), R(b)@I@@@@@@R t?R(b)@6?tДерево SLD-резолютивных вычисленийПрограмма P:P(X , Y ) ← R(X ), !, Q(Y );P(X , X ) ← Q(X );R(b) ←;Q(c) ←;Q(b) ←; ?P(U, V ), R(U)t@ ?Q(U), R(U)Rt@∗(1)(2)(3)(4)(5)!?t?R(U), , Q(V ), R(U)t?!, Q(V ), R(b)∗?6Сработал оператор отсечения.Построение деревавычислений завершено. ?R(b) tПри этом часть ветвейбыла отсечена.6?t?t?Q(V ), R(b)@I@@@@@@R t?R(b)@6?tОПЕРАТОР ОТСЕЧЕНИЯПрограммное утверждениеA0 ← A1 , . . . , Ak , !, Ak+1 , . . . , An ;содержащее оператор отсечения можно прочитывать двояко:IЧтобы решить задачу A0 нужно найти только первоерешение задач A1 , .
. . , Ak и далее решать задачиAk+1 , . . . , An . Если решение задач A1 , . . . , Ak найти неудается, то воспользоваться альтернативнымипроцедурами решения задачи A0 .IЧтобы решить задачу A0 нужно проверить условияA1 , . . . , Ak . Если эти условия выполнены, то приступить крешению задач Ak+1 , . . . , An и не обращаться к другимвариантам решения задачи A0 . Если же эти условия невыполнены, то обратиться к альтернативным способамрешения задачи A0 .ОПЕРАТОР ОТСЕЧЕНИЯТаким образом, оператор отсечения позволяет удобноиспользовать в логическом программировании стандартныеконструкции императивного программирования.IВетвление. S0 : if P then S1 else S2 fiPif −then−else : S0 ← P, !, S1 ;S0 ← S2 ;IИтерация.
S0 : while P do S1 odPwhile−do : S0 ← P, !, S1 , S0 ;S0 ←;ОПЕРАТОР ОТСЕЧЕНИЯС введением в логические программы оператора отсечениятеорема полноты операцинной семантики относительнодекларативной семантики перестают быть справедливыми.ОПЕРАТОР ОТСЕЧЕНИЯПрограммы P1 и P2 вычисления гласных буквP1Elem_Vow (X , XElem_Vow (X , ZVowel(a) ←;Vowel(e) ←;Vowel(i) ←;Vowel(o) ←;Vowel(u) ←;Vowel(y ) ←;..P2Y ) ← Vowel(X );Y ) ← Elem_Vow (X , Y );..!Elem_Vow (X , X Y ) ← Vowel(X ), ;ElemV ow (X , Z Y ) ← Elem_Vow (X , Y );Vowel(a) ←;Vowel(e) ←;Vowel(i) ←;Vowel(o) ←;Vowel(u) ←;Vowel(y ) ←;равносильны в декларативной семантике , и запрос...G :?Elem_Vow (X , o n e nil)для обеих программ имеет два правильных ответа θ1 = {X /o}и θ2 = {X /e}.ОПЕРАТОР ОТСЕЧЕНИЯПрограммы P1 и P2 вычисления гласных буквP1Elem_Vow (X , XElem_Vow (X , ZVowel(a) ←;Vowel(e) ←;Vowel(i) ←;Vowel(o) ←;Vowel(u) ←;Vowel(y ) ←;..P2Y ) ← Vowel(X );Y ) ← Elem_Vow (X , Y );..!Elem_Vow (X , X Y ) ← Vowel(X ), ;ElemV ow (X , Z Y ) ← Elem_Vow (X , Y );Vowel(a) ←;Vowel(e) ←;Vowel(i) ←;Vowel(o) ←;Vowel(u) ←;Vowel(y ) ←;но неравносильны в операционной семантике : запрос...G :?Elem_Vow (X , o n e nil)к P1 вычисляет θ1 = {X /o} и θ2 = {X /e},а тот же запрос к P2 вычисляет только θ1 = {X /o}.ОПЕРАТОР ОТСЕЧЕНИЯС введением в логические программы оператора отсечениятеорема полноты операцинной семантики относительнодекларативной семантики перестает быть справедливыми.Поэтому оператором отсеченияосторожно.! нужно пользоваться оченьА что еще полезного и удобногоможно встроить в логические программы?КОНЕЦ ЛЕКЦИИ 16..