Пролог: преобразование константы с круглыми скобками в строку - PullRequest
0 голосов
/ 15 января 2020

У меня вопрос по Прологу. Когда у меня есть константа, например, fib(7), и я хочу преобразовать ее в строку с atom_codes(fib(7), A), я получаю ошибку, что для fib(7) ожидается не числовой c атом.

Очевидно, что круглые скобки являются проблемой. Что я могу сделать?

1 Ответ

0 голосов
/ 15 января 2020

У вас есть пара недоразумений. fib(7) не является "константой". Это «термин». Это также не «атом». atom_codes (как следует из его названия) преобразует атом в список кодов символов.

Я дам вам несколько идей о том, как справиться с этой проблемой, которые я бы указал в комментариях, но это слишком длинный намек на это. :)

Вы можете написать предикат и использовать =../2 для разбиения термина. =../2 объединяет термин в качестве первого аргумента со списком в качестве второго, где функтор термина является первым элементом списка, а остальные элементы являются аргументами в термине.

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

term_codes(Term, Codes) :-
    Term =.. [Functor | Arguments],
    atom_codes(Functor, Codes),
    (   Arguments = []
    ->  true    % Term is a simple atom
    ;   % Arguments is a list of atoms or more complex terms
        % For a simple argument list, you can use atom_list_concat 
    ).

См. Пролог со списком разделенных запятыми строк для примера использования atom_list_concat и оттуда вы можете использовать atom_codes для списка.

Это только моя первая мысль по этой проблеме. На данный момент я оставлю заполнение деталей выше, если Arguments не пусто. Если вы собираетесь всегда предполагать один аргумент atomi c, предикат очень прост. Однако, если вы можете иметь произвольное количество аргументов для вашего Term, то вам нужно будет обработать его как список и объединить результаты atom_codes для каждого аргумента и включить код для запятой (,) между каждой последовательностью кодов атомов. Предикат становится еще более сложным, если ваш Term может быть составным ( например , foo (1, bar (2, 3)) `). Я не уверен, что именно, поскольку это не было указано в вопросе.

Используя ваш пример fib(7), вот концепция:

fib(7) =.. [fib, [7]]
atom_codes(fib, [102, 105, 98])
atom_codes(7, [55]),
atom_codes('(', [40]),
atom_codes(')', [41]),
% result would be: [102, 105, 98, 40, 55, 41])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...