Сравнивать планы
У меня есть проект, который предназначен для проверки правильности студенческой программы. В настоящее время я использую такой подход:
Я указываю цель, которую должна достичь студенческая программа.
Я превращаю студенческую программу в последовательность фактов и действий (в Прологе) и проверяю, могут ли эти факты и действия удовлетворить цель.
Например, если я попрошу студента написать программу, чтобы найти сумму a + b, и сохранить результат в c, то я укажу цель, которая будет выглядеть следующим образом (в стиле Пролог):
goal:- hasVarName(VarA, a), hasVarValue(VarA, ValA),
hasVarName(VarA, b), hasVarValue(VarB, ValB),
hasVarName(VarC, c), hasVarValue(VarC, ValC),
Total = ValA + ValB,
isEqual(Total, ValC).
Этот подход хорошо работает для проверки последовательной программы студента. Затем, когда я пытаюсь проверить студенческую программу, которая содержит условные выражения, я просто понимаю, что, возможно, я больше не могу использовать этот подход.
Например, если я попрошу студента написать программу, чтобы найти скидку (в долларах) от общей суммы покупки по следующей формуле:
, (Общая сумма покупки < 50) -> клиент получает скидку 5%
, (50 <= Всего покупок < 100) -> клиент получает скидку 10%
, (Общая сумма покупки>= 100) -> клиент получает скидку 20%
тогда я не могу просто написать в своей цели, что значение Дисконта (в долларах) - это всего лишь процентная скидка на общую сумму покупки.
Некоторая проблема, с которой я сталкиваюсь:
Значение процентной скидки может варьироваться в зависимости от значения общей покупки (поэтому у меня не может быть одного предиката, который можно использовать для представления значения процентной скидки)
Значение итоговой покупки - это значение переменной (ввод от пользователя) - поэтому я никогда не знаю значение этой переменной. Поэтому я не могу определить величину процентной скидки в определенное время.
Пользователь может написать оператор IF во многих вариантах, а также условный оператор внутри IF.
Мне предложили использовать концепцию условного планирования для решения такого рода проблем. Но когда я читаю некоторую информацию об условном планировании, мы, программист, указываем начальное состояние, планы и цели. В моем случае, похоже, что именно я должен указать цель, но исходное состояние и планы предоставляются студентами путем анализа их кода.
Я думаю, это немного по-другому. Но, пожалуйста, сообщите мне, если моя мысль неверна, и, пожалуйста, дайте мне исправление об этом.
Или, если это не условное планирование, какой подход я могу использовать для решения этой проблемы (проверки правильности кода ученика)? Любая информация, будь то в теоретической или практической реализации, очень ценится.
У меня есть мысль, что, вероятно, я должен сделать что-то вроде сравнения планов между планом студента (путем анализа его кода) и моим намеченным планом. Таким образом, если план учащегося совпадает с планом, который я планировал, то я могу сказать, что план / код учащегося верен. Но я думаю, что я должен сделать сравнение лучше, чем сопоставление с образцом (потому что я думаю, это просто не сработает). Но как? Пожалуйста, посоветуйте мне, если это правильный подход, который я должен сделать.
Большое спасибо.
Примечание: у меня ранее был связанный, но конкретный вопрос по этой ссылке: Как написать вид условного планирования в прологе?, Однако я только что понял, что этот конкретный вопрос не сможет помочь мне решить эту общую проблему.