пролог атома concat 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 на конце атома. пожалуйста помоги .


person T-student    schedule 23.07.2011    source источник


Ответы (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, который заменит первые две цели.

person false    schedule 23.07.2011
comment
atomic_concat/2 может работать, но при наборе текста это вызовет у вас немало головной боли. - person false; 24.07.2011