prologatom concat swi 和 yap prolog

发布于 2024-11-25 21:06:43 字数 475 浏览 1 评论 0原文

输入:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阳光下慵懒的猫 2024-12-02 21:06:43

在这种情况下,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 来取代前两个目标。

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 is atom_chars/2 and number_chars/2. So what you want is

atom_number_concat(A, N, AN) :-
   number_chars(N, Chs),
   atom_chars(Na, Chs),
   atom_concat(A, Na, AN).

YAP has a special built-in atom_number/2 which would replace the first two goals.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文