相当于SWI Prolog中的Python酸洗?

时间:2012-06-14 19:41:33

标签: serialization io prolog iso-prolog

我有一个Prolog程序,我正在对所有字符串进行一些强力搜索,直到一定长度。我正在检查哪些字符串匹配某个模式,继续添加模式,直到希望我找到一组涵盖所有字符串的模式。我想将哪些文件存储到与我的任何模式都不匹配的文件中,这样当我添加新模式时,我只需要检查剩余部分,而不是再次进行整个强力搜索。

如果我在python中写这个,我只会挑选字符串列表,并从文件中加载它。有没有人知道如何在Prolog中做类似的事情?

我有很多Prolog编程经验,但Prolog IO很少。我可能会编写一个谓词来读取一个文件并将其解析为一个术语,但我认为可能有一种方法可以更容易地完成它。

3 个答案:

答案 0 :(得分:4)

如果您想要写出一个术语,并且以后可以随时读取变量名称,请使用ISO内置write_canonical/1write_canonical/2。它是quite well supported by current systemswriteq/1write/1也经常工作,但并非总是如此。 writeq/1使用运算符语法(因此您需要使用相同的运算符将其读回)并且write/1不使用引号。所以他们“大多数时间”工作 - 直到他们休息。

或者,您可以在[quoted(true), ignore_ops(true), numbervars(false)]write_term/2中使用ISO写入选项write_term/3。如果您想使用variable_names/1等其他选项来保留变量的名称,这可能会让您感兴趣。

另请注意,书面条款不包括最后一段时间。所以你必须在最后手动写一个空格和一个句号。需要这个空间来确保由图形字符组成的原子不会破坏最后的句号。考虑编写必须写为'---'而不是--- .的原子---.。只有在原子的情况下才可以写空间。或者没有与.

“粘合”的原子

答案 1 :(得分:2)

考虑使用read / 1来读取Prolog术语。对于更复杂或不同类型的解析,请考虑使用DCG,然后使用带有SWI库(pio)的phrase_from_file / 2。

答案 2 :(得分:2)

writeqread做了类似的工作,但如果您声明任何内容,请阅读关于运算符的writeq说明。