【问题标题】:prolog atom concat swi and yap prologprolog atom concat swi 和 yap prolog
【发布时间】:2026-02-06 23:00:01
【问题描述】:

输入:

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 prolog 上我得到了正确答案:

A = abs_3(p, X, Y, Z).

yap prolog 失败。看到我应该使用 yap。

我必须使用什么来代替 concat(abs_,L,Fct_A) ?我尝试了atom_codes,但它在原子末尾附加了奇怪的ascii。请帮忙。

【问题讨论】:

    标签: prolog iso-prolog yap


    【解决方案1】:

    在这种情况下,SWI 不正确。目标atom_concat(a,1,X) 必须根据 ISO 产生类型错误; 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,它将取代前两个目标。

    【讨论】:

    • atomic_concat/2 可能会起作用,但它会让你在打字时相当头疼。