Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 附加导致的无限循环?_Loops_Recursion_Prolog_Infinite - Fatal编程技术网

Loops 附加导致的无限循环?

Loops 附加导致的无限循环?,loops,recursion,prolog,infinite,Loops,Recursion,Prolog,Infinite,我有一个问题,为什么我的代码在运行时会挂起。这段代码是为我在课堂上的一个项目编写的,但我们花了一节课的时间复习了Prolog,所以我学到的很多东西都是我自己搜索和自学的。如果我的代码包含可怕的风格错误,我真的很抱歉,但是,由于我们从未正式学习过如何“应该”使用Prolog,这主要是基于我自己的实验 我正在编写的代码段的目标或多或少是形成一条链,通过一系列演员的电影将一个演员连接到另一个演员 我有一个我正在调用的函数,该函数用于在开始演员、所有可能的链接演员和结束演员以及连接他们的电影列表之间构建

我有一个问题,为什么我的代码在运行时会挂起。这段代码是为我在课堂上的一个项目编写的,但我们花了一节课的时间复习了Prolog,所以我学到的很多东西都是我自己搜索和自学的。如果我的代码包含可怕的风格错误,我真的很抱歉,但是,由于我们从未正式学习过如何“应该”使用Prolog,这主要是基于我自己的实验

我正在编写的代码段的目标或多或少是形成一条链,通过一系列演员的电影将一个演员连接到另一个演员

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

调用函数的代码是有效的,为了使它更易于阅读,除非要求共享,否则我将省略它。简言之,它断言一个
globalStartingActor
,并将两个空列表(
ActorList=[]
MovieList=[]
)传递给函数
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会阻止代码正常工作呢?我需要有附加(或类似的功能)在这部分代码

是一个列表吗?变量的名称表明它是,以及append/3中的用法,但是
isNotInList(ActorsName,ActorList)
意味着什么?部分析取还是完全析取?这可能是无止境循环的原因,也许您应该使用这些集合的差异来增加ActorList

您应该尽量避免使用assert/1,而是在变量中传递状态。请参阅,以了解执行与您在此处尝试的操作非常类似的操作的模式

这没用,可能是打字错误,但我不理解
->

  ...
  ),
  true.
我想你应该读一读

  ...
  );     % note the semicolon!
  true.

啊。评论只能编辑五分钟,这是什么黑魔法?ActorsName与“Actor’s Name”基本相同-它是一个单数“字符串,“不是名单。isNotInList基本上是'memberof/member'的否定,它以一个项和一个列表作为参数。结尾的分号--我不明白为什么我一开始没有它。接得好,谢谢!是的,我认为断言不是最漂亮的做事方式。我也会看看你共享的链接。好的,我再看一次附加-正如你提到的ActorName建议它应该是一个列表。我将append改为being append([ActorName]、ActorList、UpdatedActorList),似乎已经解决了这个错误。谢谢你指出这一点;我想我可以把非列表的东西添加到列表中,就像我在大多数编程语言中一直做的那样!