Задача 4
Пусть бинарное дерево задается рекурсивной структурой tree(<левое поддерево>,<корень>,<правое поддерево>) и пустое дерево задано термом nil. Составьте программу subtree(+S, +T), определяющую, является ли S поддеревом T.
отзывы (лил-кид.ру).
Задача 5a
Определим операторы:
:- op( 100, fy, ~).
:- op( 110, xfy, &).
:- op( 120, xfy, v).
Булева формула есть терм, определяемый следующим образом: кон-станты true и false - булевы формулы; если X и Y - булевы формулы, то и X v Y, X & Y, ~X - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания.
Напишите программу, распознающую логические формулы в конъюнктивной нормальной форме, т.е. формулы, являющиеся конъюнкцией дизъюнкций литералов, где литерал - атомарная формула или ее отрицание.
Задача 5b
Напишите предикат p(+N, -L) - истинный тогда и только тогда, когда список L содержит все последовательности (списки) из N нулей, единиц и двоек, в которых никакая цифра не повторяется два раза подряд (нет куска вида XX).
Решение
Задача 1
Будем использовать метод накапливающего параметра. Для этого введем вспомогательный предикат position_max(+List, +I, +M0, +N0, -M, -N), где I равен номеру рассматриваемого элемента в исходном списке, M0 - текущее значение максимума, N0 - позиция текущего максимума.
position_max([X|T],M,N):-
position_max(T,1,X,1,M,N).
position_max([],_,M,N,M,N).
position_max([A|T],I,X,_,M,N):-
A>X,
K is I+1,
position_max(T,K,A,K,M,N).
position_max([A|T],I,X,Y,M,N):-
A=
K is I+1,
position_max(T,K,X,Y,M,N).
?- position_max([3,2,5,1,4,3],M,N).
M = 5
N = 3
Yes
|