5.2. Составные термы - Лекция введение. Логическая программа. Основные

^ 5.2. Составные термы
Терм распознается как составной на структурном уровне. Есть предика­ты, обеспечивающие доступ к имени функтора, арности и аргументам составного терма. Одним из таких системных предикатов является functor (Term, F, Arity). Этот 5.2. Составные термы - Лекция введение. Логическая программа. Основные предикат истинен, если главный функтор терма Term имеет имя F и арность Arity. К примеру, functor (отец (аран, лот), отец, 2) – истинен. Предикат functor, как и типовые предикаты, может быть определен таблицей фактов вида functor 5.2. Составные термы - Лекция введение. Логическая программа. Основные (f (X1, ..., XN), f, N) для каждого функтора f арности N.

Предикат functor обычно употребляется одним из 2-ух методов. 1-ый спо­соб-нахождение имени функтора и арности данного терма. К 5.2. Составные термы - Лекция введение. Логическая программа. Основные примеру, ответом на вопрос functor (отец (аран, лот), X, Y)? будет {X = отец, Y= 2}. 2-ой метод - построение терма с определенным именованием функтора и арностью. Таковой вопрос, как functor (T, отец, 2), имеет ответ Т = отец 5.2. Составные термы - Лекция введение. Логическая программа. Основные (X, Y).

Парным системным предикатом к предикату functor является предикат arg (N, Term, Arg), обеспечивающий доступ не к имени функтора, а к аргументам. Цель arg (N, Term, Arg) истинна, если Arg 5.2. Составные термы - Лекция введение. Логическая программа. Основные - N-й аргумент терма Term. К примеру цель arg (1, отец (аран, лот), аран).

Как и functor/З, предикат arg/З обычно употребляется одним из 2-ух методов. 1-ый способ-нахождение определенного аргумента 5.2. Составные термы - Лекция введение. Логическая программа. Основные составного терма. Вопрос, поясняющий схожее внедрение, -arg (2, отец (аран, лот), X)?. Ответом на вопрос будет X = лот. При втором методе использования происходит конкретиза­ция переменного аргумента терма. К примеру, при успешном решении вопроса arg 5.2. Составные термы - Лекция введение. Логическая программа. Основные (1, отец (X, лот), аран?) устанавливается соответствие X = аран.

Разглядим пример использования предикатов functor и arg при анализе термов. Отношение subterm (T1, T2), настоящее, если T1 - подтерм терма T2. Нахождение подтерма терма

subterm (Term 5.2. Составные термы - Лекция введение. Логическая программа. Основные, Term). (1)

subterm (Sub, Term): -

compound (Term),

functor(Term, F, N),

subterm (N, Sub, Term). (2)

subterm (N, Sub, Term): -

N>1, N1 := N-l, subterm (N1, Sub, Term). (3)

subterm (N, Sub 5.2. Составные термы - Лекция введение. Логическая программа. Основные, Term): -

arg (N, Term, Arg), subterm (Sub, Arg). (4)

Программка 5.2. Нахождение подтермов терма.

(1) -определяет отношение subterm/2, утверждает, что хоть какой терм является своим подтермом. (2) утверждает, что Sub является подтермом составного терма Term, если Sub 5.2. Составные термы - Лекция введение. Логическая программа. Основные - подтерм 1-го из аргументов терма Term. Определяется число аргументов. Это число употребляется в качестве счетчика цикла во вспомогательном предикате subterm/3, итерационно проверяющем все аргументы. (3) – процедура subterm/3 уменьшает значение счетчика и рекур­сивно обращается к 5.2. Составные термы - Лекция введение. Логическая программа. Основные процедуре subterm. (4) – рассматривает случай, когда Sub подтерм N –го аргумента терма. Процедура subterm может быть применена 2-мя методами: для проверки того, что 1-ый аргумент является подтермом второго, и для порождения подтермов 5.2. Составные термы - Лекция введение. Логическая программа. Основные данного терма.

Замечание: В рассмотренной программке и в последующих будем считать термы главным.

Программка 5.2-типичная программка, использующая анализ структуры. Рас­смотрим очередной пример: подстановку подтерма в терм. Реляционная схема программки подстановки подтерма в 5.2. Составные термы - Лекция введение. Логическая программа. Основные терм - substitute (Old, New, OldТеrт, NewTerm), где NewTerm -терм, приобретенный подменой всех вхож­дений подтерма Old в терме OldTerm на подтерм New. Отношение, задаваемое программкой, обобщает отношение подстановки элемента в 5.2. Составные термы - Лекция введение. Логическая программа. Основные перечень и отношение подстановки элемента в бинарное дерево.

Программка 5.3 построена по той же схеме, что и программка 5.2

substitute (Old, New, Old, New). (1)

substitute (Old, New, Term, Term): - constant (Term), Term  Old. (2)

substitute 5.2. Составные термы - Лекция введение. Логическая программа. Основные (Old, New, Term, Term1): - compound (Term),

functor (Term, F, N), functor (Term1, F, N),

substitute (N, Old, New, Term, Term1). (3)

substitute (N, Old, New, Term, Term1): - N>0, arg (N, Term, Arg),

substitute (Old 5.2. Составные термы - Лекция введение. Логическая программа. Основные, New, Arg, Arg1), arg (N, Term1, Arg1), N1:= N-l,

substitute (N1, Old, New, Term, Term1). (4)

substitute (0, Old, New, Term, Term 1). (5)

Программка 5.3. Программка подстановки термов.

Предложения процедуры substitute/4 анализируют три главных варианта. В 5.2. Составные термы - Лекция введение. Логическая программа. Основные последнем, относящемся к составным термам, происходит воззвание к вспомо­гательному предикату substitute/5, который реализует итерационную подстановку в подтермы. Арность головного функтора терма является исходным значением счетчика цикла, это значение 5.2. Составные термы - Лекция введение. Логическая программа. Основные поочередно миниатюризируется и употребляется для управления итерациями. Приведем определенный пример, проясняющий достойные внимания детали, сокрытые в тексте программки. Протокол решения вопроса substitute (cat, dog, owns (jane, cat), X)? приведен ниже.

substitute (cat, dog 5.2. Составные термы - Лекция введение. Логическая программа. Основные, owns (jane, cat), X) {X = owns (jane, cat)}

constant (owns (jane, cat)) false

substitute (cat, dog, owns (jane, cat), X)

compound (owns (jane, cat)),

functor (owns (jane, cat), F, N) {F = owns 5.2. Составные термы - Лекция введение. Логическая программа. Основные, N = 2}

functor (X, owns, 2) {X = owns (X1, X2)}

substitute (2, cat, dog, owns(jane, cat), owns (X1, X2))

2 >0

arg (2, owns (jane, cat), Arg) {Arg = cat}

substitute (cat, dog, cat, Arg1) {Arg1 = dog}

arg (2, owns 5.2. Составные термы - Лекция введение. Логическая программа. Основные (X1, X2), dog) {X2 = dog}
N1: = 2-1 {N1 = 1}
substitute (l, cat, dog, owns (jane, cat), owns (X1, dog))

1 >0

arg (1, owns (jane, cat), Arg2) {Arg2 = jane}

substitute (cat, dog, jane, Arg3) {Arg3 = jane}

constant 5.2. Составные термы - Лекция введение. Логическая программа. Основные (jane)

jane  cat

arg (l, owns (X1, dog), jane) {X1 = jane}

N2 := 1-1 {N2 = 0}

substitute (0, cat, dog, owns (jane, cat), owns (jane, dog))

0 > 0 false

substitute (0, cat, dog, owns (jane, cat), owns (jane, dog))

true

Итог: X = owns 5.2. Составные термы - Лекция введение. Логическая программа. Основные (jane, cat).

Унификация вопроса с фактом (1) программки 5.3 безуспешна. Терм owns (jane, cat) не является константой, потому (2) тоже неприменимо. Применимо (3). Разглядим 2-ое воззвание к предикату functor. Переменным N и F уже 5.2. Составные термы - Лекция введение. Логическая программа. Основные сопоставлены значения owns и 2 в предыду­щем воззвании к этому предикату, потому в рассматриваемом воззвании строится терм, служащий шаблоном ответа, который заполняется в процессе вычисления. Воззвание к цели substitute/S приводит к удачному сравнению 5.2. Составные термы - Лекция введение. Логическая программа. Основные значений аргументам терма Term1. Тут второму аргументу сопоставляется значение dog, а аргументу X1 со­поставляется значение jane.

Два воззвания к процедуре arg в процедуре substitute/5 употребляются по-раз­ному 5.2. Составные термы - Лекция введение. Логическая программа. Основные. 1-ое воззвание выделяет аргумент, 2-ое - сопоставляет аргументу значение.

Другой системный предикат, используемый при анализе структур, - бинарный оператор =.., имеющий в силу исторических обстоятельств заглавие univ. Цель Term = .. List выполнена, если голова перечня List 5.2. Составные термы - Лекция введение. Логическая программа. Основные совпадает с именованием функтора герма Term, а хвост является перечнем аргументов этого терма. К примеру, цель

(отец (аран, лот) = . .[отец, аран, лот]) выполнена.

Подобно отношениям functor и аrg, отношение univ употребляется для построения терма 5.2. Составные термы - Лекция введение. Логическая программа. Основные по данному списку (к примеру, вопрос (X = ..[отец, аран, лот])?} имеет решение X = отец (аран, лот)), либо для построения перечня по задан­ному терму (к примеру, вопрос (отец (аран, лот 5.2. Составные термы - Лекция введение. Логическая программа. Основные) = . .Xs)? имеет решение Xs =[отец, аран, лот]).

Программки, использующие предикаты functor и arg, в общем случае могут быть преобразованы в программки с отношением univ.

subterm (Term, Term).

subterm (Sub, Term): - compound(Term), Term =.. [F 5.2. Составные термы - Лекция введение. Логическая программа. Основные| Args],

subterm_list (Sub, Args).

subterm_list (Sub, [Arg | Args]): - subterm (Sub, Arg).

subterm_list (Sub, [Arg | Args]): - subterm_list (Sub, Args).

Программка 5.4. Определение подтерма при помощи =..

Программка 5.4, дающая другое определение 5.2. Составные термы - Лекция введение. Логическая программа. Основные дела subterm, эквивалентна программке 5.2. Как и в программке 5.2, тут употребляется вспомогательный предикат, анализирующий аргументы, - в дан­ном случае subterm_list. Предикат univ обеспечивает доступ к списку аргументов Args, подтермы которого находятся при помощи рекурсивного 5.2. Составные термы - Лекция введение. Логическая программа. Основные воззвания к процедуре subterm_list.

Внедрение предиката univ позволяет задать правило дифференциро­вания сложных функций. Правило утверждает, что d/dx {f (g (x))} = d/dg(x) {f (g (x))} * d 5.2. Составные термы - Лекция введение. Логическая программа. Основные/dx {g (x)}. Ранее было увидено, что данное правило нельзя выразить при помощи 1-го предложения, являющегося частью логической программки. Но, используя univ, правило дифференцирования сложной функции можно задать последующим образом:

derivative (F 5.2. Составные термы - Лекция введение. Логическая программа. Основные_G X, X, DF * DG): -

F_G_X = .. [F, G, X],

derivative (F_G_X, G_X, DF),

derivative (G_X, X, DG).

Предикат univ расщепляет функцию F_G_X на 5.2. Составные термы - Лекция введение. Логическая программа. Основные функтор F и аргумент G_X, при всем этом сразу проверяется, является ли она функцией 1-го аргумента. Рекурсивно рассчитываются производная функции F от собственного аргумента и производная функции G_X. Объединение этих вычислений 5.2. Составные термы - Лекция введение. Логическая программа. Основные приводит к решению.

Упражнения к разделу 5.2.

  1. Обусловьте предикат occurances (Sub, Term, N), настоящий, если число N равно числу
    вхождений подтерма Sub в терм Term. Подразумевается, что терм Term основной.

  2. *Обусловьте предикат position (Subterm, Term 5.2. Составные термы - Лекция введение. Логическая программа. Основные, Position), где Position - перечень номеров
    аргументов, задающий положение подтерма Sub в терме Term. К примеру, цель position
    (X, (2*sin(X)), [2, 1]) истинна, потому что sin(X) является вторым аргументом бинарного оператора «•», а X первым аргументом терма 5.2. Составные термы - Лекция введение. Логическая программа. Основные sin (X). (Указание: добавьте дополнительный аргумент к программке 5.2. задающей отношение subterm, и стройте перечень номеров способом сверху вниз.)





53-preemstvennie-etapi-obrabotki-pervichnoj-informacii-v-psihike-individa-vnutrennij-prediktor-sssr-osnovi-sociologii.html
53-programma-samostoyatelnoj-raboti-studentov-rabochaya-programma-disciplini-pravo-socialnogo-obespecheniya-napravlenie-podgotovki.html
53-raschet-i-proektirovanie-specialnih-sredstv-tehnologiya-mashinostroeniya-bijsk-izdatelstvo-altajskogo-gosudarstvennogo.html