унифицированные элементы возврата swi prolog в списке

Я хочу вернуть все элементы в списке, как показано ниже в 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.


person Trash    schedule 04.01.2012    source источник


Ответы (2)


Обратите внимание, что процедура, которую вы пытаетесь написать, - это встроенный элемент предиката / 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):- !.

Обратите внимание, однако, что это предложение будет иметь побочные эффекты, если вы вызовете эту процедуру с неустановленным первым параметром.

person gusbro    schedule 04.01.2012
comment
Я не знал, что у члена есть такая возможность, хотя оба ответа оказались очень полезными, так как мне нужно выполнять другие процедуры, подобные этому. - person Trash; 04.01.2012
comment
вместо использования cut/0 см. этот вопрос для достижения детерминизма по последнему элементу. Это то, что используется в swi, и не разрушает никакого поведения. - person m09; 04.01.2012
comment
@mog: это реализация члена SWI, которую OP должен использовать; и детерминизм в этом предикате - всего лишь уловка (я сомневаюсь, что он будет работать с каждой реализацией пролога) - person gusbro; 04.01.2012

Я пробовал писать между_ / 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).

person CapelliC    schedule 04.01.2012