Как получить простые элементы из термина? - PullRequest
0 голосов
/ 22 декабря 2018

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

Мой код:

getSimple(T, R) :- 
  compound(T), 
  T =.. [_|R]

Этот запрос работает

getSimple(f(1, 2, a), X)

Пример:

X = [1, 2, a]

Этот запрос возвращает неверный результат:

getSimple(f(2, 3, g(a)), X)

Пример:

X = [2, 3, g(a)]

Ожидаемый:

X = [2, 3, a]

1 Ответ

0 голосов
/ 22 декабря 2018

Как я уже упоминал в моих комментариях, решение должно быть рекурсивным и становится немного более сложным.

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

% We'll use an auxiliary predicate that handles a list of terms
term_args(Term, Args) :-
    term_list_args([Term], Args).

% This predicate recursively handles a list of terms, each of which is or is not be compound
%    ...so you have to check!
term_list_args([Term|Terms], Args) :-
    (   compound(Term)
    ->  Term =.. [_|TermArgs],                     % If this term is a compound term
        ___,     % Recursively process the term's arguments (TermArgs)
        ___,     % Recursively process the remaining terms (Terms)
        ___      % append the results of the two queries above to obtain Args
    ;                                              % Otherwise, if Term is not compound
        ___,     % Recursively process the remaining terms (Terms) - obtaining TermArgs
        Args = [Term|TermArgs]
    ).
term_list_args([], []).  % base case: An empty list of terms corresponds to an empty arg list

Попробуйте заполнить пробелы выше.Обратите внимание, что «рекурсивно» означает, что вы собираетесь снова что-то вызвать term_list_args/2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...