2011-07-23 70 views
-1

輸入:序言原子CONCAT SWI和邑序言

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). 

狂吠序言失敗。看到我應該使用yap。

我必須用什麼來代替concat(abs_,L,Fct_A)?我嘗試了atom_codes,但它在原子的末尾添加了奇怪的ascii。請幫忙 。

回答

2

在這種情況下,SWI不正確。根據ISO,目標atom_concat(a,1,X)必須產生類型錯誤; IF,YAP,B,GNU,SICStus,XSB,Ciao都表現得那麼好。在ISO中,有atom_chars/2number_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特殊將取代前兩個進球。

+0

atomic_concat work –

+1

'atomic_concat/2'可能會工作,但它會給你在打字時感到頭疼。 – false