Включенный_список (Список1, Список2)

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])

Если возможно, я хочу сделать это без встроенных библиотек.

Почему included_list([], [1, 2, 3, 4]) неверно?

rajashekar 19.12.2020 17:49

Я просто хочу сделать это таким образом.

John_00 19.12.2020 17:52

Будет ли это работать? subseq(L1, L2) :- append(T, _, L2), append(_, L1, T).

rajashekar 19.12.2020 18:39

@rajashekar Мне это нравится, хотя ОП хочет, чтобы subseq([], _) потерпел неудачу.

MWB 21.12.2020 10:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте DCG!

included_list(Substr, Seq) :-
   Substr = [_|_],
   phrase( ( ..., seq(Substr), ... ), Seq).

... --> [] | [_], ... .

seq([]) --> [].
seq([E|Es]) -->
   [E],
   seq(Es).

спасибо за ваш ответ, но я хочу сделать это без встроенных библиотек, если это возможно

John_00 19.12.2020 17:34

@Giannis_00: Вы используете свой member/2, который тоже является встроенным ...

false 19.12.2020 17:51

Вы правы, но я бы предпочел сделать это по-другому, я просто пишу так, потому что хочу, чтобы вопрос был более понятен.

John_00 19.12.2020 17:54

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])

John_00 19.12.2020 18:46

@Giannis_00 Нет проблем :)

Reema Q Khan 19.12.2020 18:46
Ответ принят как подходящий
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).

Другие вопросы по теме