0

私は事実のリストを持っています。それぞれの事実は、2 つの被験者間の関係と、被験者が完了したプロジェクトの数を定義します。それらは次のように定義されています。

label(allGroups,[group(a,b,10),group(b,c,3),group(c,d,12)]).

個人が完了したすべてのプロジェクトのリストを作成する関数を作成しようとしています。たとえば、「b」は合計 13 件のプロジェクトを完了し、c は合計 15 件のプロジェクトを完了しました。

これは私が今行っている機能です。

individualSum([],_,0).
individualSum([group(Name,_,Projects)|Tail],Name,Sum) :-
    individualSum(Tail,Name,Tailsum),
    Sum is Projects + Tailsum.
individualSum([group(_,Name,Projects)|Tail],Name,Sum) :-
    individualSum(Tail,Name,Tailsum),
    Sum is Projects + Tailsum.

私は偽になり続けており、それが再帰の不完全なベースケースによるものなのか、それとも完全に他の何かによるものなのかわかりません。これが私が実行しているものです:

?- [groupSum].
?- label(allGroups,L),Groups=L).

(allGroupsを吐き出し、次に:)

?- individualSum($Groups,b,Total).
false.

どこが間違っているのか分かりますか?私が得ることができる助けに感謝します。

4

2 に答える 2

1

ここでグループをスキップするには、別の句を追加する必要があります。対象はどちらも探しているものではありません。

individualSum([group(Name1,Name2,Projects)|Tail],Name,Sum):-
  Name \= Name1,
  Name \= Name2,
  individualSum(Tail,Name,Sum).
于 2013-03-28T04:02:21.007 に答える
0

Gusbro はすでに問題を発見しました (+1)。SWI-Prolog を使用しているため、組み込みの集計を使用できます。

individualSum(L,Name,Sum) :-
    aggregate_all(sum(Projects),
       ( member(group(A,B,Projects), L), ( A = Name ; B = Name )), Sum).
于 2013-03-28T08:52:59.677 に答える