Задача 3
Заданный список L сортируется по следующему алгоритму:
(1) если L содержит два соседних элемента, нарушающих требуемое упорядочение, то эти элементы меняются местами, после чего к полученному списку применяется этот же алгоритм.
(2) если в L не встречается ни одной неупорядоченной пары соседних элементов, то список L отсортирован и тем самым является искомым спи-ском.
Предикат ord(+L) проверяет является ли список L отсортированным.
ord([]).
ord([_]).
ord([X,Y|T]):-
X =< Y,
ord([Y|T]).
change(L,L):-
ord(L),!.
change(L,S):-
append(L1,[X,Y|L2],L),
X>Y,!,
append(L1,[Y,X|L2],Z),
change(Z,S).
Отсечения в данном случае ликвидируют многочисленные правильные ответы.
Задача 4
Для решения используется очевидная рекурсия.
subtree(X, X).
subtree(X, tree(L,_, _)):-
subtree(X,L).
subtree(X,tree(_,_,R)):-
subtree(X,R).
Задача 5a
Из определения операций видно, что конъюнкция и дизъюнкция являются право ассоциативными, т. е. запрос
?- X & Y & Z = A & B
приводит к унификации X = A, Y & Z = B.
Задача 2
Определим предикат p(+X,+Y,?R), где X и Y сомножители, R - произведение.
Делаем рекурсию по второму аргументу предиката, используя рекурсивное определение X*Y=X*(Y-1)+X.
p(X,0,0).
p(X,Y,R):- Y>0,
Y1 is Y-1,
p(X,Y1,R1),
R is R1+X.
p(X,Y,R):- Y<0,
Y1 is -Y,
p(X,Y1,R).
Метаинтерпретатор
|