Эквивалент травления Python в SWI Prolog?
У меня есть программа Prolog, где я выполняю поиск методом грубой силы по всем строкам до определенной длины. Я проверяю, какие строки соответствуют определенному шаблону, продолжая добавлять шаблоны, пока, надеюсь, не найду набор шаблонов, который охватывает все строки. Я хотел бы сохранить какие из них в файле, который не соответствует ни одному из моих шаблонов, так что, когда я добавляю новый шаблон, мне нужно только проверить остатки, вместо того, чтобы снова выполнять полный перебор.
Если бы я писал это на python, я просто выбрал бы список строк и загрузил его из файла. Кто-нибудь знает, как сделать что-то подобное в Прологе?
У меня большой опыт программирования на Prolog, но очень мало с Prolog IO. Я мог бы написать предикат, чтобы прочитать файл и разобрать его в термин, но я подумал, что может быть способ сделать это проще.
3 ответа
Если вы хотите выписать термин и иметь возможность прочитать его позже в любое время, исключая имена переменных, используйте встроенный ISO write_canonical/1
или же write_canonical/2
, Это довольно хорошо поддерживается современными системами. writeq/1
а также write/1
работать часто тоже, но не всегда. writeq/1
использует синтаксис оператора (поэтому вам нужно прочитать его обратно с теми же самыми присутствующими операторами) и write/1
не использует кавычки. Таким образом, они работают "большую часть времени" - пока они не сломаются.
Кроме того, вы можете использовать параметры записи ISO [quoted(true), ignore_ops(true), numbervars(false)]
в write_term/2
или же write_term/3
, Это может быть интересно для вас, если вы хотите использовать дополнительные параметры, такие как variable_names/1
сохранить также имена переменных.
Также обратите внимание, что написанный термин не включает период в конце. Таким образом, вы должны написать пробел и точку вручную в конце. Пространство необходимо для того, чтобы атом, состоящий из графических символов, не слипался с точкой в конце. Подумайте о написании атома '---'
который должен быть написан как --- .
а не как ---.
Вы можете написать пространство только в случае атома. Или атом, который не "склеивается" с .
Подумайте об использовании read/1, чтобы прочитать термин Пролог. Для более сложных или различных видов анализа рассмотрите возможность использования DCG, а затем фразу_from_file/2 с библиотекой SWI (pio).