0

私は Prolog を初めて使用し、その一部を理解するのに大きな問題があります。たとえば、私はこの「関数」を持っています:

smstofre([], []).
smstofre([T|R], [X|Y] :- frword(T,X), smstofre(R,Y).

次の「データベース」を使用:

frword(bjr,bonjour).

これは、下手に書かれたフランス語の文章を正しい文章に翻訳するために使用されます。私はそれを次のように使用します:

?- smstofre([bjr],E).
E = [bonjour].

これはクールですが、単純な文字列を受け取り、単語を分割して、前の「関数」と同じ結果を返す「関数」を作成したいと思います。たとえば、次のようになります。

?- translate('bjr cb ?', E).

返す必要があります:

E = [bonjour,combien,?].

私はswi-prologの関数atomic_list_concatを使用して文字列を分割し、他のすべてを実行する関数を作成しようとしたので、それを行いました:

reduireFosse(E, F) :- atomic_list_concat(F,' ', E), smstofre(F, E).

false を返すだけです。

それを機能させる方法は?

4

2 に答える 2

1

reduireFosse/2あなたの手順は次のように読むべきだと思います:

reduireFosse(E, G) :- atomic_list_concat(F,' ', E), smstofre(F, G).

reduireFosse の head の 2 番目の引数は、smstofre の 2 番目の引数で使用される新しいフレッシュ変数Gを使用することに注意してください。

の 2 番目の句は次のようにsmstofre/2なります。

smstofre([T|R], [X|Y]) :-
  (frword(T,W) -> X = W  ; X = T), smstofre(R,Y).

ここでは->、呼び出しがfrword/2成功したときに選択ポイントを離れないようにするために使用し、それ以外の場合は単語をそのまま返します。

于 2013-01-31T14:47:07.540 に答える
1

maplist で機能設計を使用できます。

frword(bjr, bonjour) :- !.
frword(cb, combien) :- !.
% for words not found, avoid if then else
frword(X, X).

smstofre(SMS, FRE) :-
    maplist(frword, SMS, FRE).

translate(SMS, FRE) :-
    atomic_list_concat(Tmp_In, ' ', SMS),
    smstofre(Tmp_In, Tmp_Out),
    % build a "french" sentence
    atomic_list_concat( Tmp_Out, ' ', FRE).
于 2013-01-31T17:39:27.343 に答える