这段代码的解释是什么(Prolog)?

这段代码的解释是什么(Prolog)?,prolog,backtracking,trace,Prolog,Backtracking,Trace,我正在努力学习序言。我在Prolog中有一个问题和解决方案。虽然我不能完全理解代码 代码的调用是这样的- conc(Before,[c|After],[a,b,c,d]) . 此代码将返回 Before = [a,b] After = [d] 我有解决办法- conc([],L,L). conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3) . 我不能完全理解程序的流程。让我从一次试跑开始。为了理解代码流,我添加了一些write命令。代码现在看起来像这样

我正在努力学习序言。我在Prolog中有一个问题和解决方案。虽然我不能完全理解代码

代码的调用是这样的-

conc(Before,[c|After],[a,b,c,d]) .
此代码将返回

 Before = [a,b]
    After = [d]
我有解决办法-

conc([],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3) .
我不能完全理解程序的流程。让我从一次试跑开始。为了理解代码流,我添加了一些write命令。代码现在看起来像这样-

conc([],L,L):-  write("Line1: "), write(L).
conc([X|L1],L2,[X|L3]) :-
     write("Line-2: "), write(L1), write(" "), 
     write(L2), write(" "), write(L3), conc(L1,L2,L3) .
第一个电话是-

 conc(Before,[c|After],[a,b,c,d]) .
此时,调用转到第2行(因为前面的未知项不是空的),它是:

conc([X|L1],L2,[X|L3]) :-
    write("Line-2: "), write(L1), write(" "),
    write(L2), write(" "), write(L3), conc(L1,L2,L3) .
此时,X=[a],l1=未知,L2=[c | After]和L3=[b,c,d]。这张照片-

第2行:_G481[c|u G368][b,c,d]

这将再次使用以下值调用递归(代码行2):

cons(L1, [c|After], [b,c,d]). (L1 is unknown still now)
还有,指纹-

第2行:_G494[c | _G368][c,d]

现在,下一个电话是:

cons(L1, [c|After], [c,d]).
但是,在打印代码中的自定义注释时,我可以看到,此时代码控件转到#第1行,我无法理解。因为现在,

L1= unknown(just as all the previous calls).
L(parameter 2)= [c|After]
L(parameter 3) = [c,d].
但是,控件转到#第1行,并打印:

Line1: [c,d]
我认为prolog从左到右执行代码。因此,根据我的理解,在执行时,L的值应该是[c,d]

我的问题是:

1。在第二次调用之后,L1与前面的所有调用一样未定义。第二个和第三个参数都是L。那么,为什么在第二次调用后,控件转到第1行?

2。我对这件事的理解正确吗?“我认为prolog从左到右执行代码。因此,根据我的理解,在执行L时,L的值应该是[c,d]。”

先谢谢你。。。
请帮帮我

如果你按程序来看待这里发生的一切,你就不能期望理解这里发生的一切,因为同时发生的事情太多了。如果你刚刚开始学习这门语言,尤其如此

学习Prolog的一个好方法是以陈述的方式思考,并问:是什么条件使它成立

此外,您当前正在编写原子,而实际上是在编写变量。请更正您的帖子,例如:

cons(L1, [c|After], [c,d])
因此,理解这一目标可以单独导出就足够了。另外,请注意您当前正在混合的
X=[a]
X=a
之间的区别。

请尝试以下方法以简化您的生活:
?-格式(“~w~w~w\n,[a,b,c])。
在我看来,您不是在寻找解释,而是程序跟踪。在尝试理解这一点之前,学习Prolog形式主义。这里有一个你的程序。谢谢你的回复。。但是,实际上我找不到我想要的答案。我的问题是-1。在第二次调用之后,L1与前面的所有调用一样未定义。第二个和第三个参数都是L。那么,为什么,在第二次调用之后,控件转到第1行呢?正如我所说的:试着从你给出的程序中理解,为什么以及在什么条件下,孤立的目标
cons(L1,[c | after],[c,d])
是真的。由此,您可以获得问题的答案。请记住,在Prolog中有几个控制流在起作用,例如一个(AND)用于规则体中的目标,另一个(OR)用于证明单个目标。您当前谈论的是控制流,就好像只有一个控制流一样。一般来说,您的术语需要改进,以便更详细地讨论这一点。例如,序言术语永远不能是“未定义的”。它总是一个序言术语。
L1 = [],
After = [d]