Эквивалент травления Python в SWI Prolog?

У меня есть программа Prolog, где я выполняю поиск методом грубой силы по всем строкам до определенной длины. Я проверяю, какие строки соответствуют определенному шаблону, продолжая добавлять шаблоны, пока, надеюсь, не найду набор шаблонов, который охватывает все строки. Я хотел бы сохранить какие из них в файле, который не соответствует ни одному из моих шаблонов, так что, когда я добавляю новый шаблон, мне нужно только проверить остатки, вместо того, чтобы снова выполнять полный перебор.

Если бы я писал это на python, я просто выбрал бы список строк и загрузил его из файла. Кто-нибудь знает, как сделать что-то подобное в Прологе?

У меня большой опыт программирования на Prolog, но очень мало с Prolog IO. Я мог бы написать предикат, чтобы прочитать файл и разобрать его в термин, но я подумал, что может быть способ сделать это проще.

3 ответа

Решение

writeq и read выполняют аналогичную работу, но прочитайте заметку на writeq об операторах, если вы их объявите.

Если вы хотите выписать термин и иметь возможность прочитать его позже в любое время, исключая имена переменных, используйте встроенный 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).

Другие вопросы по тегам