Prolog统一过程(concat)

Prolog统一过程(concat),prolog,concatenation,Prolog,Concatenation,下面的代码可以工作,但我对它如何在引擎盖下工作有一定的怀疑。例如,在第一次调用Exit(9)时,我不明白c是如何移动到变量O的。这是统一过程的一部分还是完全其他的东西?有人想解释一下吗 concat([], List, List). concat([Head|[]], List, [Head|List]). concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat([Head], C, Concat). 您可以“手动”

下面的代码可以工作,但我对它如何在引擎盖下工作有一定的怀疑。例如,在第一次调用Exit(9)时,我不明白c是如何移动到变量O的。这是统一过程的一部分还是完全其他的东西?有人想解释一下吗

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat([Head], C, Concat).

您可以“手动”执行统一过程,以验证标记为Exit的跟踪线:(9)实际“cons ed”[c]到[x,y,z]:

?- [Head|[]]=[c],List=[x,y,z],[Head|List]=O.
Head = c,
List = [x, y, z],
O = [c, x, y, z].
但是,您不能声称它有效:

?- concat([a,b,c],[x,y,z],L).
L = [a, b, c, x, y, z] ;
L = [a, b, c, x, y, z] ;
...
它没有终止,这清楚地表明了一些问题。第二个从句在行为和语法上都是多余的。它通常是这样写的

concat([Head], List, [Head|List]).
由于尾部列表为空,因此它隐式出现在每个列表中-除非明确指示尾部:

?- [Head|[]]=[X].
Head = X.
关于行为,您可以从跟踪中看到,这是从未使用过的第一个子句。因此,您可以认为第一个是多余的-可能您添加第二个是因为第三个子句的最后一个调用,其中需要一个“singleton”列表(我的意思是
…,concat([Head],C,concat)。
)。但是这样的电话导致了非终止问题。最好简化整个程序,删除第二条,简化第三条