2

コードを実行するとハングするように見える理由について少し質問があります。コードは私がクラスで持っているプロジェクト用ですが、私が学んだことの多くは、私が周りを検索して独学したものです。私のコードに恐ろしい文体上のエラーが含まれていたら申し訳ありませんが、繰り返しになりますが、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 がコードの正常な動作を妨げているのはなぜでしょうか? コードのその部分に追加 (または同様の関数) が必要です!

4

1 に答える 1

0

ActorsNameリストですか?変数の名前は、append / 3での使用法と同様に、それがそうであることを示唆していますが、それではどういうisNotInList(ActorsName,ActorList)意味ですか?部分的または完全な論理和?これがエンドレスループの原因である可能性があります。おそらく、これらのセットの違いを使用してActorListをインクリメントする必要があります。

assert / 1を避け、代わりに変数で状態を渡すようにしてください。ここで試みていることと非常によく似た何かをしているスキーマについては、この他の答えを参照してください。

これは役に立たない、タイプミスの可能性がありますが、私は理解していません->

  ...
  ),
  true.

私は読むべきだと思います

  ...
  );     % note the semicolon!
  true.
于 2012-11-03T07:03:08.557 に答える