学生プログラムの正確性を確認することを目的としたプロジェクトがあります。私は現在、次のようなアプローチを使用しています。
学生プログラムが達成しなければならない目標を指定します。
学生のプログラムを一連の事実と行動に (Prolog で) 変更し、これらの事実と行動が目標を達成できるかどうかを確認します。
たとえば、学生に a + b の合計を求め、その結果を c に格納するプログラムを作成するように指示した場合、目標を次のように指定します (Prolog スタイルで):
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% の割引を受ける
その場合、Discount (ドル単位) の値が単に Total Purchasing * パーセンテージ ディスカウントであると目標に書くことはできません。
私が直面しているいくつかの問題:
パーセンテージ ディスカウントの値は、Total purchase の値によって異なります (そのため、パーセンテージ ディスカウントの値を表すために使用できる述語を 1 つ持つことはできません)。
Total purchase の値は変数値 (ユーザーからの入力) です - したがって、この変数の値はわかりません。したがって、特定の時点でのパーセンテージ割引の値も決定できません。
ユーザーは、IF ステートメントをさまざまなバリエーションで記述したり、IF 内の条件ステートメントを記述したりできます。
この種の問題を解決するために、条件付き計画の概念を使用するように提案されました。しかし、条件付き計画に関する情報を読んでみると、初期状態、計画、および目標は、プログラマーである私たちによって指定されています。私の場合、目標を指定するのは私だと思われますが、初期状態と計画は学生がコードを解析して提供します。
だと思いますので、ちょっと違うと思います。しかし、私の考えが間違っていたら教えてください。それについて訂正してください。
または、条件付き計画ではない場合、この種の問題を解決するためにどのようなアプローチを使用できますか (学生コードの正確性を確認する) ? 理論的な観点であろうと実際の実装であろうと、どんな情報でも本当にありがたいです。
私はおそらく、学生の計画 (彼のコードを解析することによって) と私の意図した計画との間で、計画を比較するようなことをすべきだと考えています。したがって、学生のプランが私の意図したプランと同じかスーパーセットである場合、学生のプラン/コードは正しいと言えます。しかし、パターンマッチングを行うよりも良い方法で比較を行うべきだと思います (おそらく、うまくいかないからです)。しかし、どのように?これが私がしなければならない正しいアプローチであるかどうか、私にアドバイスしてください。
どうもありがとう。
注: 以前、このリンクに関連する特定の質問があります: How to write kind of Conditional Planning in Prolog? . ただし、これらの特定の質問は、この一般的な問題を解決するのに役立たない可能性があることに気付きました.