Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция ФилП.docx
Скачиваний:
10
Добавлен:
19.09.2019
Размер:
401.58 Кб
Скачать

Применение подстановки к структурированному терму

substitute(St1, T1, St2, T2)‏

?-substitute(sin(x), 2*sin(x)*f(sin(x)),t,F).

F=2*t*f(t).

St1 – подтерм, который нужно заменить в выражении, терме T1 на подтерм St2 и результатом будет терм T2.

Sinx меняем на Т и результат будет F.

Теперь определим рекурсивно эту процедуру.

Базовый случай. Первый аргумент такой же. Результат – терм на который нужно менять. Иначе (отрицание) если 1 и 2 арг не совпали, но выражение в котором мы делаем подстановку атомарно, оно возвращается без изменения. Результатом будет исх выр. Иначе нужно разобрать выр T1, получ фуктор и его аргумент, каждому аргументу применить подставновку, дляэтого еще одна функция substList (для списка подстановка) и далее из результатов и того же функтора F нужно собрать результат T2.

substitute(T1, T1, T2, T2):- !.

substitute(_, T, _, T):-

atomic(T), !.

substitute(ST1, T1, ST2, T2):- T1 =.. [F|Args],

substList(ST1,Args,ST2,Args2),

T2 =.. [F|Args2].

substList

Обр 2 аргумент список, каждому элементу списка применяет подстановку, и в рез – е получаем список термов к которым была применена подстановка. Когда список пуст – результат пустой список.

substList(St1,[T1|Ts1],St2,[T2|Ts2]):-

substitute(St1, T1, St2, T2),

substList(St1,Ts1,St2,Ts2).

substList(_,[],_,[]).

Можно решать задачи алгебры с помощью substitute ….

Есть и другие способы работы со структурами. Они исп когда нужно извлечь один функтор или один из компонентов структуры.

Встроенный предикат functor /3 позволяет вставлять или извлекать функтор.

Если мы вызовем цель

?- functor(Term, F,N).

То он будет истинен если F главный функтор Терма Term(самый внешний), а N арность этого терма.

?- functor( line(pnt(10,10), pnt(20,20)), F, N ).

F = line

N=2

Так мы можем извлечь функтор и его арность.

Есть еще предикат

?- arg(N, Term, A)

который позволяет работать с аргументами структуры. Он истинен если А явл Nным аргументом в терме Term. Мы можем к арг обр по номеру.

?- arg(2, f(x,t(a), t(b)), Y)

1 2 3

Аргументы считаются с единицы!

Y=t(a) – ответ.

Этими предикатами можно собрать структуру.

Рассмотрим как собрать структуру дата.

Переменная Д получает функтор …

?- functor(Д, Дата, 3),

Arg(1,Д,13),

Arg(2,Д,март),

Arg(3,Д,1999).

Когда выполнена первая цель

Д=дата( _5, _6, _7) (локальные переменные, переименованные)

Д=дата(13,6, _7).

Д=дата(13,март, _7).

Д=Дата(13,март,1999).

Есть еще возможность – термы, построенные рассмотренными нами способами можно вызывать как предикаты. Мы можем построить программу на прологе с помощью другой программы а потом выполнить (динамически построить).

Пример.

Программа строит цель а потом запускает ее на выполнение.

Выбрать(Функтор),

Вычислить(список аргументов),

Цель =.. [Функтор| список Arg],

Вызываем(Цель).

Для вызова цели есть встроенный предикат call /1.

В каестве примера рассмотрим процедуру Map, которая отображает список через любую функцию.

1 сточка – правило которое реализует функцию увеличение на единицу.

Map берет имя предиката, который моелирует функцию,функтор арности 2,берет список, и в рез-е троит новый список

Рассмотрим определение map,когда….

Если есть голова, к ней прим функцию. Строим цель. F-та функция, …будем применять. X- голова, Yрезульт голова, вызываем цель call, и далее продолж отображать хвост тобы получить хвост результата. Если список пуст то и результат пустой список.

Inc(X,Y):- Y is X+1.

map(F,[X|Xs],[Y|Ys]):-

Goal =..[F,X,Y],

Call(Goal),

map(F,[Xs],[Ys]).

map(_,[],[]).

?-map(inc,[1,2,3],X).

X=[2,3,4]