included_list
истинно, когда list1
является частью list2
.
Например,
included_list([1,2],[1,2,3,4]) is true.
included_list([2,1],[1,2,3,4]) is false.
included_list([],[1,2,3,4]) is false.
included_list([1,1,1,1,1,1],[1,2,3,4]) is false.
Какой предикат я должен написать, чтобы получить эти ответы?
Я пробовал это:
included_list([Head],List).
included_list([Head1|Tail1],[Head2|Tail2]) :-
member(Head1,[Head2]),included_list(Tail1, Tail2).
Но он возвращает true, когда я спрашиваю included_list([1,1,1,1,1,1],[1,2,3,4])
Если возможно, я хочу сделать это без встроенных библиотек.
Я просто хочу сделать это таким образом.
Будет ли это работать? subseq(L1, L2) :- append(T, _, L2), append(_, L1, T).
@rajashekar Мне это нравится, хотя ОП хочет, чтобы subseq([], _)
потерпел неудачу.
Используйте DCG!
included_list(Substr, Seq) :-
Substr = [_|_],
phrase( ( ..., seq(Substr), ... ), Seq).
... --> [] | [_], ... .
seq([]) --> [].
seq([E|Es]) -->
[E],
seq(Es).
спасибо за ваш ответ, но я хочу сделать это без встроенных библиотек, если это возможно
@Giannis_00: Вы используете свой member/2, который тоже является встроенным ...
Вы правы, но я бы предпочел сделать это по-другому, я просто пишу так, потому что хочу, чтобы вопрос был более понятен.
1-предикат include1 создает все возможные подмножества List2, а затем проверяет, входит ли List1 в эти подмножества. Если да, то он присутствует в списке2, если нет, то его нет.
2- Для создания подмножеств splitSet используются предикаты перестановки и опускания.
include1([H1|T1],[H2|T2]):-
splitSet([H2|T2],_,Sublist),
Sublist=[_|_], %disallowing empty list
permute(Sublist,M),
[H1|T1]=M.
splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
splitSet(T,L,R).
permute([ ],[ ]) :- !.
permute(L,[X|R]) :-
omit(X,L,M),
permute(M,R).
omit(H,[H|T],T).
omit(X,[H|L],[H|R]) :-
omit(X,L,R).
Примеры с вашими тестами:
?-include1([4,5],[1,2,3]).
false
?-include1([1,1,1,1,1,1],[1,2,3,4]).
false
?-include1([1,2],[1,2,3,4]).
true
false
?-include1([],[1,2,3,4]).
false
В этом случае ([2,1],[1,2,3,4]) это верно, поскольку [1,2,3,4] создаст подмножество с [2,1].
спасибо за ответ :), теперь я пытаюсь найти способ дать false для ([2,1],[1,2,3,4])
@Giannis_00 Нет проблем :)
starts_with([H], [H|_]).
starts_with([H|T1], [H|T2]) :- starts_with(T1, T2).
included_list(X, Y) :- starts_with(X, Y).
included_list(X, [_|T]) :- included_list(X, T).
Тесты:
?- included_list([], [1, 2, 3, 2, 1]).
false.
?- included_list([2, X], [1, 2, 3, 2, 1]).
X = 3 ;
X = 1 ;
false.
Версия 2, основанная на коде @rajashekar:
included_list([X|Y], L2) :- append(T, _, L2), append(_, [X|Y], T).
Почему
included_list([], [1, 2, 3, 4])
неверно?