2

特定の長さまでのすべての文字列に対してブルートフォース検索を行っているPrologプログラムがあります。どの文字列が特定のパターンに一致するかを確認し、うまくいけばすべての文字列をカバーする一連のパターンが見つかるまでパターンを追加し続けます。どのパターンにも一致しないものをファイルに保存したいので、新しいパターンを追加するときに、総当たり検索全体を再度実行するのではなく、残り物を確認するだけで済みます。

これを Python で書いていたら、文字列のリストをピクルして、ファイルからロードするだけです。Prologで似たようなことをする方法を知っている人はいますか?

Prolog プログラミングの経験は豊富ですが、Prolog IO の経験はほとんどありません。おそらく、ファイルを読み取って用語に解析するための述語を作成することもできますが、もっと簡単に行う方法があるのではないかと考えました。

4

3 に答える 3

4

If you want to write out a term and be able to read it back later at any time barring variables names, use the ISO built-in write_canonical/1 or write_canonical/2. It is quite well supported by current systems. writeq/1 and write/1 work often too, but not always. writeq/1 uses operator syntax (so you need to read it back with the very same operators present) and write/1 does not use quotes. So they work "most of the time" — until they break.

Alternatively, you may use the ISO write-options [quoted(true), ignore_ops(true), numbervars(false)] in write_term/2 or write_term/3. This might be interesting to you if you want to use further options like variable_names/1 to retain also the names of the variables.

Also note that the term written does not include a period at the end. So you have to write a space and a period manually at the end. The space is needed to ensure that an atom consisting of graphic characters does not clobber with the period at the end. Think of writing the atom '---' which must be written as --- . and not as ---. You might write the space only in case of an atom. Or an atom that does not "glue" with .

于 2012-06-15T09:06:04.950 に答える
2

writeqreadは同様の仕事をしますが、宣言する場合は、演算子に関する writeq の注意を読んでください。

于 2012-06-15T05:58:44.127 に答える
2

Prolog 用語を読み取るために read/1 を使用することを検討してください。より複雑な、または異なる種類の解析については、DCG を使用してから、SWI のライブラリ (pio) でphrase_from_file/2 を使用することを検討してください。

于 2012-06-14T21:24:15.513 に答える