Я хочу вернуть все элементы в списке, как показано ниже в X
?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.
У меня есть следующий код, но он также возвращает пустой элемент списка [], который нежелателен.
return_member(X, X).
return_list_members([], []).
return_list_members([H|T], X) :- return_member(H, X); return_list_members(T, X).
вывод при допросе
?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = [].
также нежелательны значения истина или ложь в конце в конце.
Цель состоит в том, чтобы получить функцию, которая выводит как встроенная функция между / 3, чтобы использовать ее в инструкции foreach.
Ответ 1 · рейтинг 1 · gusbro
Обратите внимание, что процедура, которую вы пытаетесь написать, - это встроенный элемент предиката / 2.
?- member(X, [1,2,3,4,5]).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.
Вы также можете написать собственное определение, например:
return_list_members([X|_], X).
return_list_members([_|T], X):-
return_list_members(T, X).
и если вы не хотите, чтобы интерпретатор возвращал false в конце, вы можете добавить еще одно предложение в начале (как первое предложение):
return_list_members([X], X):- !.
Обратите внимание, однако, что это предложение будет иметь побочные эффекты, если вы вызовете эту процедуру с неустановленным первым параметром.
Ответ 2 · CapelliC
Я пробовал писать между_ / 3:
between_(X, X, X) :-
!.
between_(X, Y, X) :-
X < Y.
between_(X, Y, N) :-
X < Y,
T is X + 1,
between_(T, Y, N).
Первое предложение требуется, чтобы избежать последнего false (как уже заметил gusbro).