2

私の問題: リストが与えられた場合

L = [x1,...,xn]

整数convert(L,X)に変換する Prolog プログラムを書くL

x1*10^0 + x2*10^1 + ... + xn*10^(n-1)

結果を に格納しXます。

例えば

?- convert( [1,2,3,4] , Res ).
Res = 4321.

私はこの問題を解決しようとしていましたが、電力の組み込み関数を使用しようとすると構文エラーが発生します。これは私がこれまでに持っているものです:

convert([],Res) .
convert(L1,Res) :- conv( L1 , Res , C ) .

conv( [] , Res , C ) .
conv( [H|Ys] , Res , C ):-
  C1 is C-1 ,
  N is (H*(10**C)) ,
  conv(Ys,Res2,C1) ,
  Res is N + Res2 .

次のエラーが表示されます。

******* syntax error
>>>   conv ( [ H | Ys ] , Res , C ) :- C1 is C - 1 , N is ( H * ( 10  <--- HERE? >>>

それで、誰かがこのエラーを取り除く方法を教えてもらえますか??

さらに、構文的に間違っている方法はありますか??

これで私を助けてください。ありがとうございました。

4

2 に答える 2

3

SWI-Prolog を使用すると、次のように動作します。

:- use_module(library(lambda)).

convert(L,Res) :-
    reverse(L, LR),
    foldl(\X^Y^Z^(Z is Y * 10 + X), LR, 0, Res).

あなたのコードのために:

convert([],Res) . <== Here Res is a free variable
convert(L1,Res) :-conv(L1,Res,C). <== here C is free

conv([],Res,C). <== Here Res anc C are free

これはうまくいきません。あなたが試すことができます

conv([],0).
conv([H|Ys],Res):-
  conv(Ys,Res2),
  Res is Res2 * 10 + H.
于 2012-11-30T12:35:34.343 に答える
0

元のポスターは正しい軌道に乗っていました。ただし、これは を使用せずに行いますlibrary(lambda)

convert( Xs , R ) :-        % to sum a list of values, scaling each by their corresponding power of 10,
  convert( Xs , 1 , 0 , R ) % just invoke the worker predicate, seeding the power accumulator with 10^0 (1)
  .                         % and the result accumulator with zero (0).

convert( []     , _ , R , R ) .   % when we exhaust the source list, we're done: unify the result R with the result accumulator
convert( [X|Xs] , P , T , R ) :-  % otherwise...
  T1 is T + X*P ,                 % - increment the result accumulator by the current list item, scaled by the current power of 10,
  P1 is P*10 ,                    % - bump up to the next power of 10, and
  convert(Xs,P1,T1,R)             % - recurse down.
  .                               %

Prolog の組み込み指数を使用して行うこともできます (ただし、単純でも高速でもありません)。

convert( Xs , R ) :-
  convert(Xs,0,0,R)
  .

convert( []     , _ , R , R ) .
convert( [X|Xs] , N , T , R ) :-
  T1 is T + X * 10**N ,
  N1 is N+1 ,
  convert1(Xs,N1,T1,R)
  .

ただし、(少なくとも SWI、Quintus、または Sicstus では) 最も簡単で最もエレガントな方法はlibrary(aggregate)、ワンライナーを使用して記述することです。

convert( Xs , R ) :- aggregate( sum(X*10**N) , nth0(N,Xs,X) , R ) .
于 2014-05-20T20:18:42.770 に答える