2

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

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

我有丰富的 Prolog 编程经验,但很少使用 Prolog IO。我可能会编写一个谓词来读取文件并将其解析为一个术语,但我认为可能有一种方法可以更轻松地做到这一点。

4

3 回答 3

4

如果您想写出一个术语并能够在以后随时读取它,除非变量名称,请使用 ISO 内置write_canonical/1write_canonical/2. 当前系统很好地支持它。writeq/1write/1经常工作,但并非总是如此。writeq/1使用运算符语法(因此您需要使用相同的运算符将其读回)并且write/1不使用引号。所以他们“大部分时间”都在工作——直到他们崩溃。

或者,您可以使用或[quoted(true), ignore_ops(true), numbervars(false)]中的 ISO 写入选项。如果您想使用更多选项(例如保留变量的名称),这可能对您来说很有趣。write_term/2write_term/3variable_names/1

另请注意,书面术语末尾不包括句点。所以你必须在最后手动写一个空格和一个句点。需要空格以确保由图形字符组成的原子不会与末尾的句点相冲突。想想写'---'必须写成--- .而不是写成的原子---.你可能只写一个原子的空间。或者一个不“粘合”的原子.

于 2012-06-15T09:06:04.950 回答
2

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

于 2012-06-14T21:24:15.513 回答
2

writeqread做类似的工作,但是如果你声明了,请阅读 writeq 关于操作符的注释。

于 2012-06-15T05:58:44.127 回答