我有一个Prolog程序,我正在对所有字符串进行一些强力搜索,直到一定长度。我正在检查哪些字符串匹配某个模式,继续添加模式,直到希望我找到一组涵盖所有字符串的模式。我想将哪些文件存储到与我的任何模式都不匹配的文件中,这样当我添加新模式时,我只需要检查剩余部分,而不是再次进行整个强力搜索。
如果我在python中写这个,我只会挑选字符串列表,并从文件中加载它。有没有人知道如何在Prolog中做类似的事情?
我有很多Prolog编程经验,但Prolog IO很少。我可能会编写一个谓词来读取一个文件并将其解析为一个术语,但我认为可能有一种方法可以更容易地完成它。
答案 0 :(得分:4)
如果您想要写出一个术语,并且以后可以随时读取变量名称,请使用ISO内置write_canonical/1
或write_canonical/2
。它是quite well supported by current systems。 writeq/1
和write/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)