Альтернативное решение, использующее стандартное де-факто определение предиката append/3
:
check(SubList, List) :-
append(Prefix, _, List),
append(_, SubList, Prefix).
Примеры вызовов:
| ?- check([b,d],[a,b,c,d]).
no
| ?- check([b,c],[a,b,c,d]).
true ? ;
no
| ?- check([b,c],[a,b,c,d,b,c,f]).
true ? ;
true ? ;
no
Мы также можем использовать это определение для создания подсписка-список пар:
| ?- check(SubList, List).
SubList = [] ? ;
List = [A|_]
SubList = [A] ? ;
List = [_|_]
SubList = [] ? ;
List = [A,B|_]
SubList = [A,B] ? ;
List = [_,A|_]
SubList = [A] ? ;
List = [_,_|_]
SubList = [] ? ;
List = [A,B,C|_]
SubList = [A,B,C] ? ;
List = [_,A,B|_]
SubList = [A,B] ? ;
...
Эта проблема также дает вам возможность узнать о окончании свойствах предикатов.В качестве эксперимента измените порядок вызовов append/3
, а затем проверьте, что происходит при возврате, например, для двух первых примеров вызовов.