Пролог Атом Конкат Swi и Yap Пролог
Вход:
run([p(X,Y,Z),h(Z,P,Q)],Out).
код:
:- ensure_loaded(library(lists)).
run([X|Y],Out) :-
X =.. [Fct|Args],
X =..Total,
length(Args,L),
concat(abs_,L,Fct_A),
Out =.. [Fct_A|Total].
на swi пролог я получаю правильный ответ:
A = abs_3(p, X, Y, Z).
на тявкать пролог не получится. Видно, что я должен использовать трепло.
что я должен использовать вместо concat(abs_,L,Fct_A)
? я попробовал atom_codes, но он добавляет странный ascii на конец атома. пожалуйста помоги.
1 ответ
Решение
В этом случае SWI неверен. Цель atom_concat(a,1,X)
должен выдавать ошибку типа в соответствии с ISO; IF, YAP, B, GNU, SICStus, XSB, Ciao ведут себя именно так. В ISO есть atom_chars/2
а также number_chars/2
, Итак, что вы хотите, это
atom_number_concat(A, N, AN) :-
number_chars(N, Chs),
atom_chars(Na, Chs),
atom_concat(A, Na, AN).
YAP имеет специальный встроенный atom_number/2
который заменит первые две цели.