Предикат Prolog, который возвращает список после проверки элемента

Я новичок в прологе. Я пытаюсь написать предикат, который принимает элемент и список, проверяет наличие элемента в списке и возвращает остальную часть списка после элемента.
Примером является mypredicate (3, [1 2, 3 , 4, 5, 6, 7]) возвращает [3, 4, 5, 6, 7].
Надеюсь, я смогу объяснить.

mypredicate(X, [X|_]).
mypredicate(X, [_|T]) :- mypredicate(X,T).

По сути, это просто проверка, есть ли элемент в списке. Как мне написать правило, которое возвращает оставшуюся часть списка после X?


person Dragon    schedule 05.04.2017    source источник


Ответы (2)


Вам нужно вернуть весь список в базовом случае, например:

mypredicate(X, [X|T],[X|T]).

Также пункт:

 mypredicate(X, [_|T]) :- mypredicate(X,T).

используется, когда заголовок списка - X, поэтому вам нужно убедиться, что в этом случае заголовок отличается от X, например:

mypredicate(X, [H|T],L) :- dif(X,H),mypredicate(X,T).
person coder    schedule 05.04.2017
comment
mypredicate(X, [X|T]). во всех практических целях идентичен предложению OP ', будучи T одноэлементным - person CapelliC; 06.04.2017
comment
@CapelliC, спасибо (+1) !!! отредактировал ответ, я не заметил, что пропустил параметр, так как не пытался его проверить ... - person coder; 06.04.2017

вы должны добавить третий аргумент

mypredicate(X,[X|L],[X|L]).
mypredicate(X,[_|T],L) :- mypredicate(X,T,L).

Если вас интересует только первое вхождение X и L, добавьте сокращение к первому правилу:

mypredicate(X,[X|L],[X|L]) :- !.

Другой способ - использовать предикат библиотеки (списков):

edit исправлено после комментария @ tim.newport

mypredicate(X,L,[X|T]) :- append(_,[X|T],L).
person CapelliC    schedule 06.04.2017
comment
Это возвращает только хвост, но не голову, как только предмет будет найден. Возвращает X = [4,5,6,7] при поиске 3. - person tim.newport; 09.04.2018