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プロローグで私は正しい答えを得る:

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

yapプロローグで失敗します。私はyapを使うべきだとわかりました。

代わりに何を使用する必要がありconcat(abs_,L,Fct_A)ますか?atom_codesを試しましたが、アトムの最後に奇妙なASCIIが追加されています。助けてください 。

4

1 に答える 1

3

この場合、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、最初の2つの目標に代わる特別な機能が組み込まれています。

于 2011-07-23T19:51:44.693 に答える