Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TrashОтветов: 2

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

logicprolog

Ответы

Ответ 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).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы