コードを実行するとハングするように見える理由について少し質問があります。コードは私がクラスで持っているプロジェクト用ですが、私が学んだことの多くは、私が周りを検索して独学したものです。私のコードに恐ろしい文体上のエラーが含まれていたら申し訳ありませんが、繰り返しになりますが、Prolog をどのように「使用すべき」かを正式に学んだことがないため、これは主に私自身の実験に基づいています。
私が書いているコード セグメントの目標は、多かれ少なかれ、ある俳優が出演した一連の映画を通じて、ある俳優を別の俳優につなぐチェーンを形成することです。
私が呼び出している関数は、最初の俳優、すべての可能なリンクされた俳優、最後の俳優、およびそれらを接続する映画のリストの間の接続を構築するためのものです。これはおそらく恐ろしく非効率的な方法ですが、この方法で実装すると、割り当ての 2 つの部分が 1 つのコード セグメントで解決されます。
関数を呼び出すコードは機能します。これを読みやすくするために、共有するよう求められない限り省略します。つまり、 a をアサートしglobalStartingActor
、2 つの空のリスト ( ActorList = []
and MovieList = []
) を function に渡しますdoActorAssertions
。
次に、 がありdoActorAssertions
ます。これはその改訂版であり、単純化して読みやすくする必要がありますが、以前にあった大量のコメントがありません。
doActorAssertions(ActorsName,ActorList,MovieList) :-
isNotInList(ActorsName,ActorList) ->
(
findMoviesIn(ActorsName,MoviesIn),%finds all movies ActorsName is in
howLong(MoviesIn,LenMoviesIn),%Sees how many movies there are.
(
LenMoviesIn ==0;
(
append(ActorsName,ActorList,UpdatedActorList),%this causes errors!
globalStartingActor(GSAName),%asserted starting actor
assert(connectedActors(GSAName,ActorsName,MovieList)), %says that the GSAName is connected to ActorsName by a list of movies MovieList.
write(actorAsserted),
addAndTraverse(MoviesIn,UpdatedActorList,MovieList) %Goes to propegate all movies the actor is in, then actors in those movies, then recursively calls this function again.
)
)
),
true.
先ほども言いましたが、append
タグがエラーの原因のようでした! コードを上記のように単純化すると、これは実際に当てはまるようです。追加することをコメントするだけで、コード本体が機能します。
では、append がコードの正常な動作を妨げているのはなぜでしょうか? コードのその部分に追加 (または同様の関数) が必要です!