Предикат 'присоединить' можно использовать для разделения списка на два подсписка, если первые два аргумента объявить как переменные, а третий аргумент конкретизировать заданным списком:
'прог':- 'присоединить'(Х,Y,[2,3,4]),
write(' X='),write(X),tab(2),
write(' Y='),write(Y),nl,fail.
'прог'.
На вопрос
? - 'прог'.
получим ответы:
X=[] Y=[2,3,4]
X=[2] Y=[3,4]
X=[2,3] Y=[4]
X=[2,3,4] Y=[]
? -
Если требуется получить только непустые списки Х,Y, то в предикате 'прог' надо написать целевое утверждение 'присоединить' в следующем виде: 'присоединить'([Х1|Т],[Y1|F],[2,3,4]).
Аналогично с помощью одного и того же предиката 'присоединить', но с разными шаблонами аргументов можно задавать способы разделения списка на подсписки. Рассмотрим шуточную программу 'мутанты'. С помощью этой программы образуются названия гибридов различных животных. Животные задаются их названиями в форме списка букв. Два животных производят на свет мутанта, если окончание названия первого из них совпадает с началом названия второго. В этой программе отношение 'присоединить' применяется двумя способами: в одном случае для разделения списка, в другом - для объединения двух списков.
/* МУТАНТЫ */
'мутант'(Z):-'животное'(X),'животное'(Y),'присоединить'(A,[B|T],X),
'присоединить'([B|T],C,Y),'присоединить'(X,C,Z).
'присоединить'([],L,L).
'присоединить'([X|L1],L2,[X|L3]):-'присоединить'(L1,L2,L3).
'красивый_мутант':- 'мутант'(Z),tab(5),'вывод_сп'(Z),fail.
'красивый_мутант':- nl.
'животное'(['к','р','о','к','о','д','и','л']).
'животное'(['ч','е','р','е','п','а','х','а']).
'животное'(['к','а','р','и','б','у']).
'животное'(['л','о','ш','а','д','ь']).
'животное'(['х','а','м','е','л','е','о','н']).
'животное'(['б','у','й','в','о','л']).
'животное'(['в','о','л','к']).
'вывод_сп'([]):- nl,!.
'вывод_сп'([X|T]):- write(X), 'вывод_сп'(T).
? - 'красивый_'мутант'.
крокодил
крокодилошадь
черепаха
черепахамелеон
карибу
карибуйвол
лошадь
хамелеон
буйволошадь
буйвол
буйволк
волкрокодил
волкарибу
волк
|