У вас есть пара недоразумений. 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])