Пролог Атом Конкат 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 который заменит первые две цели.

Другие вопросы по тегам