私の意図は、Prologにおける推移性の簡単な例(自分のためだけ)を実装することでした。Prolog:単純な事実のための推移性を確認してください
これらは私の事実です:
trust_direct(p1, p2).
trust_direct(p1, p3).
trust_direct(p2, p4).
trust_direct(p2, p5).
trust_direct(p5, p6).
trust_direct(p6, p7).
trust_direct(p7, p8).
trust_direct(p100, p200).
私はC
とA
信託このB
信頼B
があるたびに真である、A
信託C
かどうかを確認するために、この述語を書いた:
trusts(A, B) :-
trust_direct(A, B).
trusts(A, C) :-
trusts(A, B),
trusts(B, C).
は、
述語は、たとえばtrusts(p1, p2)
またはtrusts(p1, p5)
の場合はtrue
を返しますが、trusts(p5, p6)
は既にERROR: Out of local stack
を返します。
Prologはこれをすばやくスタックにフラッディングしますか?
trusts
私の考え/実装は悪い/無駄なシステムメモリですか?
ニース説明の定義を使用して、あなたのPrologシステムのテーブル化施設を使用します! (trust_direct(A、B)、trusts(B、C) '(' trust_direct/2'への呼び出し)、なぜそうしたのでしょうか? 2番目の 'trust(A、B): - trust_direct(A、B) 'が必要です。 – daniel451
それは素晴らしい質問であり、それ自体で投稿する価値があります!これについて新しい質問を提出し、私たちはそこに続きましょう! – mat
ここにあります:[簡単な推移性検査のための不必要な述語定義?](https://stackoverflow.com/questions/42496415/unnecessary-predicate-definition-for-simple-transitivity-checkup) – daniel451