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

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

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

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


person jmite    schedule 14.06.2012    source источник


Ответы (3)


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

person CapelliC    schedule 15.06.2012

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

Также обратите внимание, что срок написания не включает точку в конце. Таким образом, вы должны написать пробел и точку вручную в конце. Пробел нужен для того, чтобы атом, состоящий из графических символов, не затирался точкой в ​​конце. Подумайте о написании атома '---', который должен быть записан как --- ., а не как ---.. Вы можете написать пробел только в случае атома. Или атом, который не "склеивается" с .

person false    schedule 15.06.2012

Рассмотрите возможность использования read/1 для чтения термина Prolog. Для более сложных или иных видов синтаксического анализа рассмотрите возможность использования DCG, а затем фразу_из_файла/2 с библиотекой SWI (pio).

person mat    schedule 14.06.2012