swi prolog унифицированный возврат элементов в списке - PullRequest
0 голосов
/ 04 января 2012

Я хочу вернуть все элементы в списке, как показано ниже в X

?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

У меня есть следующий код, но он также возвращает пустой элемент списка [] witch нежелательно .

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 = [].

также true или false в конце значения не желательны вend.

Цель состоит в том, чтобы получить функцию, которая выводит, например, встроенную функцию между / 3 , которая будет , используемой в выражении foreach

Ответы [ 2 ]

1 голос
/ 04 января 2012

Обратите внимание, что процедура, которую вы пытаетесь написать, является встроенным элементом предиката / 2.

?- member(X, [1,2,3,4,5]).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

Вы также можете написать собственное определение, например ::100100

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

и если вы не хотите, чтобы интерпретатор возвращал false в конце, вы можете добавить еще одно предложение в начале (как первое предложение):

return_list_members([X], X):- !.

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

0 голосов
/ 04 января 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).

Первое предложение, которое требуется, чтобы избежать окончательного ложного (как уже заметил gusbro).

...