失敗によるループでは、遅かれ早かれ何らかの問題が発生する特定の部分が開いたまま未指定のままになることがよくあります。特に、変数の正確な定量化は簡単に未解決のままです。多くの場合、このようなループはまとめて回避できます。あなたの例では、なぜあなたが議論をしているのか、私にははっきりしませんsomeGoal/1
。少なくともあなたはそれを使用しません。したがって、いくつかの疑問が生じます。
一致する値がない場合、何を期待しますか? 元のプログラムは何も出力せず、失敗します。
冗長なエントリがある場合、何を期待しますか? 何回も印刷したいですか?
値の正確な順序を主張しますか、それとも別の順序を想像できますか?
値を見ることに興味があるのはなぜですか?ほとんどの場合、それらを具体的な名前に関連付けて表示するか、合計や平均などの集計が必要です。
これらに対する答えがわからないので、いくつかの解決策を提示できます。私はあなたの例を1つの追加の(冗長な)事実で取り上げます:
幸福(フレッド、5)。
幸福(ジョン、3)。
幸福(ジョン、3)。
幸福(恵み、2)。
?-セット (PH、幸福 (P、H)、PHs)。
PH = [フレッド-5、グレース-2、ジョン-3]。
?- setof(H,P^happiness(P,H), PHs)。
PH = [2, 3, 5]。
?- bagof(H,P^happiness(P,H), PHs)。
PH = [5, 3, 3, 2]。