2

关于为什么我的代码在运行时似乎挂起,我有一点疑问。该代码是针对我在课堂上的一个项目,但我们花了一节课时间研究 Prolog,所以我学到的很多东西都是我四处寻找并自学的东西。如果我的代码包含可怕的文体错误,我深表歉意,但同样,由于我们从未正式了解过如何“应该”使用 Prolog,这主要是基于我自己的实验。

我正在编写的代码段的目标或多或少是形成一条链,通过他们参与的一系列电影将一个演员与另一个演员联系起来。

我有一个我正在调用的函数,该函数旨在在起始演员、所有可能的链接演员结束演员以及连接它们的电影列表之间建立联系。这可能是一种非常低效的方法,但是以这种方式实现它可以用一段代码解决分配的两个部分。

调用该函数的代码有效,为了使代码更易于阅读,除非要求分享,否则我将省略它。简而言之,它断言 a globalStartingActor,并将两个空列表 ( 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,而是在变量中传递状态。请参阅this other answer以获取与您在此处尝试的非常相似的模式。

这没用,可能是错字,但是我不明白->

  ...
  ),
  true.

我认为应该读

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