我正在学习使用prolog和列表并应用trace命令并自己绘制纸质跟踪,但我不太清楚调试如何使用列表(如果没有列表)。我有以下示例程序。
p([X],X).
p([X|L],Y):-p(L,Y).
q([X,X]).
我应用查询
p(V,2),q(V).
我得到的控制台宝贝就是这个
Call: (9) p(_612, 2) ? creep
Exit: (9) p([2], 2) ? creep
Call: (9) q([2]) ? creep
Fail: (9) q([2]) ? creep
Redo: (9) p(_612, 2) ? creep
Call: (10) p(_902, 2) ? creep
Exit: (10) p([2], 2) ? creep
Exit: (9) p([_900, 2], 2) ? creep
Call: (9) q([_900, 2]) ? creep
Exit: (9) q([2, 2]) ? creep
V = [2, 2] ;
然后循环到无穷大,但这对我来说无关紧要,因为我不知道如何得到V = [2,2]的解;
进行适当的替换,使它们统一,我得到文字p(V,2)
[X] = L
2 = X
[X | L] = V
[2 | L] = V
所以我想要的是知道V的值,所以我会[2,[2]],这可以转化为[2,2]?
然后我必须检查它是否统一的第二个文字q(V),所以它是一个有效的解决方案。这会是你的推理吗?