Я хочу проанализировать логическое выражение с помощью DCG в Прологе.
Логические термины представлены в виде списков, например ['x','&&','y']
для x ∧ y
результатом должно быть дерево синтаксического анализа and(X,Y)
(были X
и Y
неназначенные переменные Пролога).
Я реализовал это, и все работает, как ожидалось, но у меня есть одна проблема:
Я не могу понять, как анализировать переменные 'x'
и 'y'
, чтобы получить реальные переменные Prolog X
и Y
для последующего присвоения значений истинности.
Я пробовал следующие варианты правил:
v(X) --> [X].
:
Конечно, это не работает, возвращается толькоand('x','y')
.
Но могу ли я единообразно заменить логические переменные в этом термине на переменные Пролога? Я знаю предикатterm_to_atom
(который предлагается как решение аналогичной проблемы), но я не думаю, что здесь можно использовать его для достижения желаемого результата.v(Y) --> [X], {nonvar(Y)}.
:
Это действительно возвращает несвязанную переменную, но, конечно же, каждый раз новую, даже если логическая переменная ('x', 'y', ...) уже была в термине, поэтому['X','&&','X']
оценивается какand(X,Y)
, что является тоже не желаемый результат.
Есть ли какое-нибудь изящное или идиоматическое решение этой проблемы?
Спасибо заранее!
РЕДАКТИРОВАТЬ:
Предпосылкой к этому вопросу является то, что я пытаюсь реализовать алгоритм DPLL на Прологе. Я подумал, что было бы разумно напрямую проанализировать логический термин в Prolog-term, чтобы упростить использование средства обратного отслеживания Prolog:
- Ввод: какой-нибудь логический термин, например, T =
[x,'&&',y]
- Срок действия после синтаксического анализа:
[G_123,'&&',G_456]
(теперь с "настоящими" переменными Пролога) - Присвойте значение из {boolean (t), boolean (f)} первой несвязанной переменной в T.
- упростить термин.
- ... повторять или возвращаться, пока не будет найдено
v
присвоение, так чтоv(T) = t
или пространство поиска не будет исчерпано.
Я новичок в Prolog и, честно говоря, не мог придумать лучшего подхода. Меня очень интересуют альтернативы получше! (Так что я наполовину уверен, что это то, чего я хочу ;-) и большое спасибо за вашу поддержку до сих пор ...)
X
иY
? Вы настаиваете на'x'
картеX
? Или вы просто хотите, чтобы все ваши'x'
ссылались на одну и ту же переменную в конечном дереве синтаксического анализа? - person   schedule 18.11.2014