我有一个关于为什么我的代码在我运行时似乎挂起的问题。代码是针对我在课堂上的一个项目,但我们花了一个课程时间考虑Prolog,因此我学到的很多东西都是我搜索过的并且自学过的东西。如果我的代码包含可怕的风格错误,我会道歉,但同样,由于我们从未正式了解我们应该如何使用Prolog,这主要基于我自己的实验。
我正在编写的代码片段的目标或多或少是形成一个链,通过他们所在的一系列电影将一个演员连接到另一个演员。
我有一个我正在调用的函数,用于构建一个起始actor,所有可能的链接actor以结束actor,以及连接它们的电影列表之间的连接。这可能是一种非常低效的方法,但是以这种方式实现它可以用一段代码解决赋值的两个部分。
调用该函数的代码有效,为了使这个更简单,我将省略它,除非要求共享它。简而言之,它声明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
标签似乎是错误的来源!当我将代码简化为上面的内容时,确实会出现这种情况。我只是评论附加,代码正文工作。
为什么要追加阻止代码正常工作?我需要在代码的那一部分附加(或类似的功能)!
答案 0 :(得分:0)
ActorsName
是一个列表吗?变量'name表示它是,以及append / 3中的用法,但是isNotInList(ActorsName,ActorList)
是什么意思?部分还是完全分离?这可能是无限循环的原因,也许你应该使用这些集的差异来增加ActorList。
您应该尝试避免使用assert / 1,而是在变量中传递状态。有关模式与您在此处尝试的模式非常相似,请参阅this other answer。
这没用,可能是拼写错误,但后来我不理解->
...
),
true.
我认为应该阅读
...
); % note the semicolon!
true.