Prolog 终止条件序言

Prolog 终止条件序言,prolog,termination,failure-slice,Prolog,Termination,Failure Slice,我的老师给我们提供了一些关于序言的幻灯片,我发现有些奇怪 reverse([],[]). reverse([X|Xs],Zs) :- reverse(Xs,Ys), append(Ys, [X], Zs). 根据他的说法,当第一个参数reverse([],…)是一个完整的列表时,程序终止。 此外,如果将谓词中的目标切换为reverse([X | Xs],Zs):-append(Ys[X],Zs),reverse(Xs,Ys)。当第二个参数是完整的列表reverse(…,[])时,程序应该终止。

我的老师给我们提供了一些关于序言的幻灯片,我发现有些奇怪

reverse([],[]).
reverse([X|Xs],Zs) :- reverse(Xs,Ys), append(Ys, [X], Zs).
根据他的说法,当第一个参数
reverse([],…)
是一个完整的列表时,程序终止。 此外,如果将谓词中的目标切换为
reverse([X | Xs],Zs):-append(Ys[X],Zs),reverse(Xs,Ys)。
当第二个参数是完整的列表
reverse(…,[])时,程序应该终止。

这有点违背了我到目前为止所学到的。我认为这两个论点都影响了程序的终止条件,显然,根据我老师的例子,它们并没有影响程序的终止条件。
有人能给我一些信息吗?

由于Prolog相对复杂的控制流程,Prolog程序的终止属性有点难以掌握。有很多方法可以降低复杂性。一个是通过在程序中插入额外的目标<强> >代码> false <代码> <强>来考虑程序的各个部分。你可以把它们放在任何地方。不管你把它们放在什么地方,下面的结论都成立:如果这个叫做a的新程序没有终止,那么你原来的程序也不会终止。注意“如果”。这是你的节目:

reverse([],[]) :- false. reverse([X|Xs],Zs) :- reverse(Xs,Ys), false, append(Ys, [X], Zs). 因此,尽管这个片段仍然坚持第一个参数是
[124; 124;]
,但它没有考虑剩余的项。因此,目标不会终止

如果你想了解更多,请查看。同样,考虑一下。为了培养良好的直觉,你需要自己尝试一下

reverse([],[]) :- false. reverse([X|Xs],Zs) :- append(Ys, [X], Zs), false, reverse(Xs,Ys). append([], Zs, Zs) :- false. append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs), false.