質問: SWI-Prologの仕様についての質問です。ver 7.1.17 または ver 6.6.1 で確認したことですが、 基本的に現在のこの処理系はソースプログラム中のアトムに改行を含んでよい。それをインタプリタトップが読み込む際に'\n'コードに変換する。5行以上の改行を許可したい場合は、~/src/pl-incl.h の#define NEWLINES 5 の値を大きな値に変えて、コンパイルし直せばよい。そう理解しています。インタプリタトップに於いてもソースプログラムと同様です。 ところが、以下の例では、 ``` ?- read_term_from_atom('ab cd',X,[]). ERROR: Syntax error: Operator expected ERROR: ab ERROR: ** here ** ERROR: cd . ?- ``` とエラーになってしまいます。これは atom_to_term/3 を使っても同じ現象が生じます。 マクロ処理的な前段を含むか含まないか、処理後のアトムを見ているか、処理前のアトムを 見ているか、によって起こっているようにも思えます。 これら述語はごく当たり前に使用する述語であり、もしこのような仕様だとすれば、 その悪影響は甚大であると考えます。これは、正当な理由のある仕様なのでしょうか。 それともバグの類であると考えて、改善を求めるべきなのでしょうか。
回答: これ、すみません。私の勘違いでした。 削除したいところですが、どこに問題があったかを 示すべきなので残します。 私が指摘した問題は、一旦、改行を含むアトムとして、 成功裡に取れた後の、解析フェーズで起こったものでした。 解析対象のアトムが改行を間に挟んだ、 ``` 'ab cd' ``` ではエラーになるのは当然でした。abの後にカンマを付加して ``` ?- read_term_from_atom('ab, cd',X,[]). X = (ab, cd) ``` ならばエラーにはなりません。 つまり、構文エラーにならないような、項として認識できるような 複数行のアトムを与えて確かめなければいけませんでした。 実は、私がアトム中の改行数が多すぎる時に出る エラーメッセージと構文解析時に出るエラーメッセージを 全く同じもののように錯覚していました。ところが確認して みると改行数エラーのメッセージは ``` ERROR: Stream User_input:14:1 Syntax error:String too long ``` のようなものであり、全くの別物でした。 ということで、昨夜に書いた釈明ではこの二つの メッセージが同一だったので混乱したことになって いましたが、実際には同じではなく、全て私の勘違いで あったことがわかりました。 返す返す、お騒がせして、申し訳ありません。