2

「S」で指定された学生がすべての科目で「A」の成績を取得したかどうかを確認するために、次のプログラムを作成しました。ここで、検索ツリーのすべてのパスがグレード「A」で評価された場合にのみ、出力「true」を与えることができることを知っています。生徒がカット述語でグレード「A」を取得していない場合、私は達成することができます。しかし、すべてのパスが検索されたときにtrueと評価された述語を指定する方法が実際にはわかりません。

grade(123,'CSE1','A').
grade(123,'DIC','A').
grade(123,'ML','A').
grade(123,'PL','A').
grade(123,'CVIP','A').
grade(1234,'CSE1','A').
grade(1234,'DIC','A').
grade(1234,'ML','A').
grade(1234,'PL','B').
grade(1234,'CVIP','B').

honor(S):-grade(S,_,Y),not(Y='A'),!,false.
4

2 に答える 2

2

私はこのように手順を変更します(あなたのコードはあなたのために働いていますか?)

honor(S) :- grade(S,_,_), (grade(S,_,Y), Y \= 'A', !, fail ; true).

テスト:

?- honor(S).
S = 123 ;
S = 123 ;
S = 123 ;
S = 123 ;
S = 123 ;
false.

?- setof(S,honor(S),L).
L = [123].

コメントの後で編集してください。このスニペットの方が便利だと思います。

honor(S) :- once(a_grade(S)).
a_grade(S) :- grade(S,_,_), (grade(S,_,Y), Y \= 'A', !, fail ; true).

組み込みのsetof /3のすべてのソリューションを使用して、別のより良い定義をさらに編集します。

honor(S) :-
   setof(S, C^G^grade(S,C,G), Ss),
   member(S, Ss),
   \+ (grade(S,_,G), G \= 'A').

setof / 3を使用してもう1つ編集すると、リスト全体を作成することを回避できますが、関連するサブジェクトのリストのみが作成されます。

honor(S) :-
   setof(S, C^G^(grade(S,C,G), \+ (grade(S,_,G2), G2 \= 'A')), Ss),
   member(S, Ss).
于 2012-12-09T17:04:34.173 に答える
0

上記の質問に対する回答を得るには、2つの方法があります。1。まず、Capellicによって指定されたsetofを使用します。

honor(S) :-
   setof(S, C^G^(grade(S,C,G), \+ (grade(S,_,G2), G2 \= 'A')), Ss),
   member(S, Ss).

2. setofを使用しない場合:

ismember(S):-grade(S,_,Y),!.
honor(S) :- ismember(S),\+ (grade(S,_,Y), Y \= 'A').
于 2012-12-10T05:40:04.363 に答える