Пролог - первый список является подсписком второго списка? - PullRequest
1 голос
/ 13 августа 2011

Например:

isin([1,2,3], [1,0,1,2,3,0])

даст значение true, потому что 123 находится внутри 101230

Я написал следующий код:

isin([AH|AT],[AH|AT]).

isin([AH|AT],[BH|BT]):- AH = BH, isin(AT,BT),isin([AH|AT],BT).

, кажется, не работает. Старайтесь не использовать никаких встроенных функций и BTW, у Prolog есть встроенная функция sublist(L1,L2).

Как мне написать запрос к встроенной функции, используя SWI-Prolog? Я пытался напрямую написать

?- sublist([1],[2]).

но это дает мне underfined procedure ошибку.

Можно ли увидеть, как закодирована встроенная функция? Как?

Ответы [ 4 ]

8 голосов
/ 14 августа 2011
sublist( [], _ ).
sublist( [X|XS], [X|XSS] ) :- sublist( XS, XSS ).
sublist( [X|XS], [_|XSS] ) :- sublist( [X|XS], XSS ).
1 голос
/ 12 августа 2014

Если хотите

my_sublist( [2,3,4], [1,2,3,4,5] ) 

... чтобы добиться успеха, но

my_sublist( [1,3,5], [1,2,3,4,5] ) 

... потерпеть неудачу, вы можете рассмотреть

my_sublist( Sublist, List ) :-
    append( [_, Sublist, _], List ).

Обратите внимание, что если вы передадите переменную в качестве подсписка, при обратном отслеживании вы получите полный набор всех возможных подсписков списка, но в целом это будет включать несколько повторов пустого списка (поскольку пустой список может сочетаться со всеми другими перечисляет как впереди, так и позади них в операции добавления).

0 голосов
/ 02 декабря 2018

другая реализация, использующая член:

sublist([],_).
sublist([X|Xs],Y) :- member(X,Y) , sublist(Xs,Y).

member / 2 возвращает true, если найти элемент в списке

member(X,[X|_]).
member(X,[_|Ys]):-member(X,Ys).
0 голосов
/ 13 августа 2011

Поскольку это, кажется, домашнее задание, я дам вам только несколько советов:

  • Кажется, вы упускаете случай, когда пустой список является подсписком другого.

  • Вы смешали два случая "здесь начинается подсписок" и "список начинается позже" в одном предложении.

  • Кажется, элементыподсписок должен быть последовательным в большем списке.Для этого вам нужно два предиката.По сути, вы должны помнить, что подсписок начался, когда вы разбираете списки.

Нет встроенного sublist/2, только sublist/3, который делает что-то другое (фильтр спискапредикат).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...