3

私はPrologで最初の一歩を踏み出しましたが、問題が発生しました。

カンマで区切られたファイルレコードから読み込もうとしています

upto_comma(Codes) --> string(Codes), ",", !.
list_w([W|Ws]) --> upto_comma(W), [W] ,list_w(Ws).
string([]) -->  [].
string([H|T]) -->[H],string(T).

しかし、私が得たのは単一の文字のリストだけであり、私が欲しかったのは要素のリストです。たとえばから

cat,dog,table

私が欲しい[cat,dog,table]と私は得[c,a,t,d,o,g,t,a,b,l,e]た。

着替えてみましupto_comma

upto_comma(Atom) --> string(Codes), ",", !,{ atom_codes(Atom, Codes) }.

しかし、何も変わりませんでした。

私が誤解したいくつかの基本的な概念があると思います、誰かが助けることができますか?SWIPrologを使用しています

4

2 に答える 2

3

あなたの文法には list_w//1 の基本ケースがありません。なぜ upto_comma(W) の後に同じことを読む必要があるのか​​ 理解できません。

私はこのように書くでしょう

list_w([W|Ws]) --> string(W), ",", !, list_w(Ws).
list_w([W]) --> string(W).

string([]) -->  [].
string([H|T]) -->[H],string(T).

テスト:

?- phrase(list_w(S),"cat,dog").
S = [[99, 97, 116], [100, 111, 103]] ;
false.
于 2012-12-15T21:56:36.940 に答える
1

面白い; あなたが示したコードからはその結果が得られません。入力の解析に失敗しました。

stringまず、ルールが何を認識するかを考えます。文字列を認識しますか?または、コンマを含まない文字列のみですか?

次に、list_w がどのように終了するかを考えてみましょう。入力の最後の「テーブル」のケースを処理するコードはどれですか? 「テーブル」の後にコンマが続く必要があるため、upto_comma にすることはできません。また、list_w には upto_comma を含まない右側はありません。

于 2012-12-15T23:10:51.653 に答える