prologatom concat swi 和 yap prolog
输入:
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。请帮忙。
input :
run([p(X,Y,Z),h(Z,P,Q)],Out).
code:
:- 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].
on swi prolog i get the right answer:
A = abs_3(p, X, Y, Z).
on yap prolog fail. Seen that i should use yap.
what i have to use instead of concat(abs_,L,Fct_A)
? i tried atom_codes but it append strange ascii on the end of the atom. please help .
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在这种情况下,SWI 是不正确的。目标
atom_concat(a,1,X)
必须根据 ISO 产生类型错误; IF、YAP、B、GNU、SICStus、XSB、Ciao 都这样做。在 ISO 中,有atom_chars/2
和number_chars/2
。所以你想要的是YAP 有一个特殊的内置
atom_number/2
来取代前两个目标。In this case SWI is incorrect. The goal
atom_concat(a,1,X)
has to produce a type error according to ISO ; and IF, YAP, B, GNU, SICStus, XSB, Ciao all behave that way. In ISO, there isatom_chars/2
andnumber_chars/2
. So what you want isYAP has a special built-in
atom_number/2
which would replace the first two goals.