Сравнивать планы

У меня есть проект, который предназначен для проверки правильности студенческой программы. В настоящее время я использую такой подход:

  1. Я указываю цель, которую должна достичь студенческая программа.

  2. Я превращаю студенческую программу в последовательность фактов и действий (в Прологе) и проверяю, могут ли эти факты и действия удовлетворить цель.

Например, если я попрошу студента написать программу, чтобы найти сумму 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%

тогда я не могу просто написать в своей цели, что значение Дисконта (в долларах) - это всего лишь процентная скидка на общую сумму покупки.

Некоторая проблема, с которой я сталкиваюсь:

  1. Значение процентной скидки может варьироваться в зависимости от значения общей покупки (поэтому у меня не может быть одного предиката, который можно использовать для представления значения процентной скидки)

  2. Значение итоговой покупки - это значение переменной (ввод от пользователя) - поэтому я никогда не знаю значение этой переменной. Поэтому я не могу определить величину процентной скидки в определенное время.

  3. Пользователь может написать оператор IF во многих вариантах, а также условный оператор внутри IF.

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

Я думаю, это немного по-другому. Но, пожалуйста, сообщите мне, если моя мысль неверна, и, пожалуйста, дайте мне исправление об этом.

Или, если это не условное планирование, какой подход я могу использовать для решения этой проблемы (проверки правильности кода ученика)? Любая информация, будь то в теоретической или практической реализации, очень ценится.

У меня есть мысль, что, вероятно, я должен сделать что-то вроде сравнения планов между планом студента (путем анализа его кода) и моим намеченным планом. Таким образом, если план учащегося совпадает с планом, который я планировал, то я могу сказать, что план / код учащегося верен. Но я думаю, что я должен сделать сравнение лучше, чем сопоставление с образцом (потому что я думаю, это просто не сработает). Но как? Пожалуйста, посоветуйте мне, если это правильный подход, который я должен сделать.

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

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

0 ответов

Другие вопросы по тегам