3

学生プログラムが特定の目標を達成できるかどうかを確認できるプログラムを作成しようとしています。私はその部分を行うことができます。ここで、学生プログラムに実際に不要なコードが含まれているかどうかを確認したいと思います。このケースを解決するには、学生プログラムに特定の目標に貢献しない事実が含まれているかどうかを知る必要があると思います。しかし、目標に貢献しない事実を見つける方法がわかりません。

理解しやすくするために、より単純な例を考えてみましょう。この例では、指定された目標は次のとおりです。ジョンはトミーの祖父ですか?

father(john, jim).
father(jim, tomy).
father(john, david).
father(bruce, anne).
mother(mary, jim).

grandfather(A,B) :- father(A, X), father(X,B).

goal:- grandfather(john, tomy).

実際には、次の事実によってのみ目標を達成できます。

father(john, jim).
father(jim, tomy).

そして、私が知りたいのは、実際にはどの事実が目標に貢献していないかということです. 答えは、次のすべての事実になります。

father(john, david).
father(bruce, anne).
mother(mary, jim).

どんな助けでも本当に感謝しています。ありがとう

4

3 に答える 3

2

Prolog で質問に直接回答することはできませんが、failure-sliceを使用して手動で回答できます。falseプログラムに目標を追加するだけで、goalそれでも成功するかどうかを常にテストしてください。これが私が入手した最小限のプログラムです。

父(ジョン、ジム)。
父(ジム、トミー)。
父(ジョン、デビッド):-  父(ブルース、アン):-母 (メアリー、ジム) :- false .

祖父(A,B) :- 父(A, X), 父(X,B).

目標:- 祖父(ジョン、トミー)。

純粋で単調なプログラムに目標を挿入するたびfalseに、ソリューションのセットが削減される (または同じままである) ことが確実にわかります。したがって、そのようなスライスを見つけるには、そのような目標を設定する場所とほぼ同じ数の試行が必要です。X = termプログラムをさらに絞り込むために、目標を追加したい場合もあります。

失敗スライスは、プログラムの終了プロパティを理解したい場合に特に役立ちます。詳細については、を参照してください。

于 2013-05-28T21:03:25.680 に答える
0

もう 1 つのオプションは、述語節のカバレッジを行う単体テスト フレームワークを変更して使用することです。どの句がそれに寄与しないかを調べたいという目標を持つ単体テストを定義します。修正ビットは、必要に応じて、カバレッジ レポートを修正して、それらの句も特定することです。私が言いたいことの例として、明確でない場合はlgtunit、Logtalk ディストリビューションの例の 1 つを使用して、Logtalk ツールの次の出力を検討してください。

?- {ack(tester)}.
% 
% tests started at 2013/6/5, 19:54:9
% running tests from object tests
% file: /Users/pmoura/logtalk/examples/ack/tests.lgt
% ack_1: success
% ack_2: success
% ack_3: success
% 3 tests: 0 skipped, 3 passed, 0 failed
% completed tests from object tests
% ack: ack/3 - [1,2,3] (3/3)
% 1 unit declared in the test file containing 3 clauses
% 1 unit covered containing 3 clauses
% 3 out of 3 clauses covered, 100,000000% coverage
% tests ended at 2013/6/5, 19:54:9
% 
true.

この線:

% ack: ack/3 - [1,2,3] (3/3)

ack/3述語の 3 つの単体テストで使用された句を示します。

于 2013-06-05T18:52:52.143 に答える