Підсписок.
Розглянемо
відношення підсписок який має 2 аргументи:
список
S
який міститься в L
в якості підсписку.
підсписок([c,
d, e], [a, b, c, d, e, f])
буде істинне
підсписок([c,
e], [a, b, c, d, e, f])
буде
хибним
Відношення
підсписок модна задати використовуючи
таке формулювання
S є
підсписком L
якщо
L
можна розбити на 2 списки L1
і
L2
,
а L2
можна
розбити на 2 списки S
і
L3.
Для
розбиття списків можна використати
відношення конк:
підсписок(S,
L)
:- конк(L1,
L2, L), конк(S,
L3, L2).
?-
підсписок(S,
[a, b, c]).
Відповідь:
S
= [a, b, c];
S
= [a, b];
S
= [b, c];
S
= [a];
S
= [b];
S
= [c];
S
= [];
Перестановки.
Запишемо
відношення перестановка з двома
аргументами: 2 списки один з яких буде
перестановкою іншого. Процедура для
відношення перестановка базується на
двох правилах:
Якщо
перший список порожній то і другий має
бути порожнім. перестановка([],
[]).
Якщо
перший список не порожній то він має
вигляд [X|L]
і перестановку такого списку можна
зробити так: спочатку отримати список
L1
який є перестановкою L,
а потім вставити X
у
довільну позицію L1.
перестановка([X|L],
P):-
перестановка(L,
L1),вставити(X,L1,P).
?-
перестановка([a,
b, c], P).
Відповідь:
P
= [b, c, a];
P
= [c, a, b];
Написати
відношення перестановка1
яке
би будувало перестановки використовуючи
відношення вилучення.