1

プロローグに組み込み関数 findall/3 があることを知っており、総時間数(Thrs)を見つけてリストに保存し、リストを合計しようとしています。しかし、それは私にはうまくいきません。ここに私のコードがあります:

totalLecHrs(LN,THrs) :-
    lecturer(LN,LId),
    findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
    sumList(L,Thrs).

何が悪いのか教えていただけますか?どうもありがとう。

4

2 に答える 2

2

findall/3サブゴールの時間に「ダミー」変数を使用する必要があります。あなたが書いたものは、 THrs をsumList/2の戻り値と、 findall/3によって L にリストされる変数の両方として使用しています。X を findall の最初の引数として使用し、対応するサブゴールLectureSegmentHrs/5で最後の引数として使用します。

于 2011-03-14T23:36:26.843 に答える
0

問題は、同じ変数 ( Thrs) を異なる目的で 2 回使用していることにあるようです。ただし、さまざまな場所でさまざまな大文字を使用しているため、見分けるのは困難です。findall呼び出しで初期変数の大文字と小文字が同じになるように行を変更しlectureSegmentHrsます。次に、別の変数を完全に使用して、最終的な出力値 (つまり、sumList述語全体の戻りスロットに表示される値) を取得します。

Prolog は変数の再割り当てをサポートしていないため、別の変数を使用する必要があります。論理言語では、変数を再割り当てするという概念は本質的に不可能です。次のようなものは賢明に見えるかもしれません...

...
X = 10,
X = 11,
...

,しかし、Prolog では が結合演算子であることを覚えておく必要があります。X が同時に 10 と 11 の両方である問題の解決策を見つけるように Prolog に効果的に伝えています。したがって、それは明らかに不可能であることがわかります。

代わりに、作業を進めながら新しい変数名を作成する必要があります。時々、これは少し厄介になりますが、論理言語の領域に沿っているだけです。

于 2011-03-15T09:55:48.770 に答える