Я думаю, что вы, вероятно, имели флаг double_quotes в codes
, когда constant_value был скомпилирован. Значение этого флага не повлияет на предложения, уже сохраненные в базе данных.
constant_value1 --> "ID".
:-set_prolog_flag(double_quotes, chars).
constant_value2 --> "ID".
?- listing(constant_value1).
constant_value1([73, 68|A], A).
?- listing(constant_value2).
constant_value2(['I', 'D'|A], A).
Редактировать Guy Coder
Поскольку я использую Q & A в SO как личную записную книжку со своими Q & A, я склонен смотреть на принятый ответ для деталей ; Я добавляю их сюда для всеобщего блага.
Как правильно говорит этот ответ, проблема была вызвана тем фактом, что первоначально в исходном коде, который был модулем, хранящимся в виде файла, перед кодом
было написано
:- set_prolog_flag(double_quotes,chars).
]
constant_value --> "ID".
затем в REPL
?- consult('C:/dcg_examples.pl').
?- listing(constant_value).
constant_value(['I', 'D'|A], A).
true.
и использовать этот
?- phrase(constant_value,"ID").
true.
В последнем исходном коде я изменил значение для double_quotes
[ 115]
замечают, что изменение с chars
на codes
Перезапуск REPL и выполнение тех же действий
?- consult('C:/dcg_examples.pl').
?- listing(constant_value).
constant_value([73, 68|A], A).
true.
?- phrase(constant_value,"ID").
true.
дали другой результат для листинга / 1.
Однако в REPL использование
set_prolog_flag(double_quotes,).
не оказало влияния на результат листинга / 1.
< ЗНАЧЕНИЕ > может быть одним из string
, chars
, codes
, traditional
или atom
.
Ключевым моментом, который следует здесь отметить, является то, что в листинге / 1 используется проверенный / скомпилированный / сохраненный код. Таким образом, значение double_quotes
во время консультации / компиляции / хранения - это то, что использует листинг / 1. Любые изменения в double_quotes
после этого в REPL не изменят полученный / скомпилированный / сохраненный код и, следовательно, результат листинга / 1.
Чтобы осуществить изменение, вы должны добавить
:- set_prolog_flag(double_quotes,).
в ваш исходный код перед предикатом, затем консультироваться с / 1 , чтобы загрузить его, а затем перечислить / 1.
Значение «консультируется / компилируется / сохраняется» не означает, что это три отдельных действия, выполняемых в последовательности, здесь они определяют, когда исходный код помещается в базу данных для использования в листинге / 1.
к сожалению, СОДЕРЖИТ только подстановочные знаки префикса поддержек:
CONTAINS(*, '"book*"')
Если Вы хотите сделать некоторый серьезный полнотекстовый поиск затем, я был бы (и иметь), используют Lucene. Сеть. MS Полнотекстовый поиск SQL никогда, кажется, не работает что хорошо на что-либо кроме основ.
Полнотекстовый поиск SQL Server основан на тексте маркирования в слова. Нет никакой меньшей единицы как слово, таким образом, пустяками, которые можно искать, являются слова.
Можно использовать поиски префикса для поиска соответствий, которые запускаются с определенных символов, который возможен, потому что списки слов сохранены в алфавитном порядке, и весь Сервер должен сделать, просканировать через список для нахождения соответствий.
Сделать то, что Вы хотите запрос с a LIKE '%book%'
пункт, вероятно, был бы так же, как быстро (или медленный).