編集:シングルトン変数を見つけました。Prolog は、データ バンクの大文字化された単語が好きではありません。また、コードにいくつかの大幅な変更を加えました。
edit:edit : 再帰呼び出しがないことに気付きました。ダープ
Haskell を使用した関数型プログラミングの経験はありますが、Prolog にはかなり慣れていません。
関数にステートメントを真にするすべての可能な値を出力させようとすると問題が発生しますが。過去数時間調べてきたので、論理エラーではないと思いますが、間違っている可能性があります。
この問題では、車の所有履歴を作成しようとしています。
-- 私はある人が車を所有していることを知っています。
これらの事実を知っているので、車、所有者、およびこの再帰の基本ケースとして機能するディーラーの別の変数を作成するデータバンクを設定しました。
car(prius).
car(bmw).
owner(meg).
owner(nora).
dealer(d).
boughtFrom(meg,nora).
boughtFrom(nora,d).
私は、メグがディーラーから購入したノラから購入したことを立証しました。ディーラーから購入すると、これがベースケースのエンドポイントであるため、私が計画している再帰は停止します。したがって、ロジックは次のようになります。
ownCar(X,Y) :- boughtFrom(X,d), car(Y).
ownCar(X,Y) :- ownCar(boughtFrom(_,prevowner(X)), car(Y)).
あなたがディーラーである場合、または前の所有者から車を購入した場合は、車の所有者になることができます。ディーラーまたは別の前の所有者から購入した場合は、その前の所有者が所有者です。などなど したがって、停止するのは、その人がディーラーから車を購入したときだけです。