DCG を使用して、文字列をスペースで区切られた 2 つの部分に分割しようとしています。たとえば、「abc def」は「abc」と「def」を返すはずです。プログラムとDCGは以下です。
main:-
prompt(_, ''),
repeat,
read_line_to_codes(current_input, Codes),
(
Codes = end_of_file
->
true
;
processData(Codes),
fail
).
processData(Codes):-
(
phrase(data(Part1, Part2), Codes)
->
format('~s, ~s\n', [ Part1, Part2 ])
;
format('Didn''t recognize data.\n')
).
data([ P1 | Part1 ], [ P2 | Part2 ]) --> [ P1 | Part1 ], spaces(_), [ P2 | Part2 ].
spaces([ S | S1 ]) --> [ S ], { code_type(S, space) }, (spaces(S1); "").
これは正しく動作します。しかし、[ P1 | Part1 ]
&を入力しなければならないの[ P2 | Part2 ]
は本当に冗長であることがわかりました。そこで、の定義で[ P1 | Part1 ]
w/ Part1
& 同様に w/のすべてのインスタンスを置き換えてみました。つまり、次のようになります。[ P2 | Part2 ]
data
data(Part1, Part2) --> Part1, spaces(_), Part2.
入力するのははるかに簡単ですが、Arguments are not sufficiently instantiated
エラーが発生しました。したがって、バインドされていない変数は、DCG のコードのリストとして自動的に解釈されないようです。これを冗長にする他の方法はありますか?私の意図は、他のプログラミング言語で正規表現を使用するところに DCG を使用することです。