Как написать вид условного планирования в прологе?
==================================================

Я попытался написать код пролога, который может понять программу студента, написанную на C #. Теперь я застрял в процессе распознавания утверждения «если» в студенческой программе. Например: ниже приведен код, который я ожидаю от студента.

Я определил цель этого ожидаемого кода как:

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

Я пытался изменить первую часть кода студента, чтобы она стала похожа на факты, подобные приведенным ниже, но я не знаю, как представить утверждение студента «если» как факты / правила в прологе (я думаю, я не должен менять его на пролог «если», верно?)

И еще один, в моей цели, когда у меня есть сравнение, такое как`gt(Vd,0)` Я думаю, что я не могу использовать пролог больше, чем оператор, ни`Vd> 0` ни`Vd @> 0` причиной того, что значение в Vd на самом деле является определенным значением, введенным пользователем, но оно представляется как символическое значение (в данном случае это:`val_d`).

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

или же

Но опять же, мне нужна помощь / идея, как этот код может быть представлен в прологе как действие / правило / факт для достижения цели.

Любая помощь очень ценится.

Большое спасибо

о, в котором удобно указывать семантические действия, реализующие конструкции, которые нам разрешено выражать.

Кажется, вы пропускаете этап построения синтаксического дерева и (вручную?) Представляете промежуточный уровень программы.

Если вы придерживаетесь такого представления среднего уровня, вы можете использовать рекурсивный термин (по сути, абстрактное дерево), например`if(Condition, Then, Else)` где каждый var это в свою очередь синтаксическое дерево.

В противном случае, для более практического представления (обычно применяемого для императивного языка), используйте понятия базовых блоков (последовательность команд без переходов), а затем меток, чтобы описать поток выполнения.

В результате получается график, и поведение программы определяется «топологией» этого представления.

Обратите внимание, что я не обратил никакого внимания на правильное описание вашей программы-примера, просто поместил переходы, чтобы показать эту возможность ...

**редактировать** Я думаю, чтоГенеральная проблема не может быть решена, будучи эквивалентной[проблема остановки](https://en.wikipedia.org/wiki/Halting_problem) для машины Тьюринга. Для конкретного случая под рукой,без петельЯ бы атаковал проблему, используя абстрактную интерпретацию на AST. То есть интерпретатор, который вычисляет то, что интересно.

Если это возможно, зависит от общности ваших целевых программ. Вы должны иметь возможность разделить целочисленный домен для каждой переменной, участвующей в каждой точке условия. Вещи становятся быстро сложными ...

В частности, в точке условия IF THEN ELSE попытаться разбить домен. Используя такой подход, давайте прологвыполнять IF проверяет обе ветви, распространяя значения. Но, как я уже сказал, это не очень легко ...



 что вы пытались смоделировать if-then-else с помощью импликации, используя следующую логическую идентификацию:

Вместо использования сочетаний значений легче использовать дизъюнкцию для выбора между ветвями и конъюнкцией вдоль потока управления. Но то, что вы исключаете предыдущие if-условия через отрицание, все еще необходимо.

Возьмите свой пример:

Вы можете использовать CLP (*) для моделирования. Добавьте дополнительные переменные, чтобы переменные не переопределялись, но это не проблема в небольшом приведенном фрагменте. В CLP (*) приведенный выше фрагмент становится, я использую CLP (FD) для простоты:

В приличной системе CLP (*) вы можете произвольно создавать или ограничивать D или S в запросе. Мы получаем, например, уже в CLP (FD):

до свидания