我正在学习Prolog,并看到了这段代码。
结果表明,此代码获取列表的N个元素,例如,如果我们提供以下查询:
我哪里做错了吗?
foo([],[]).
foo([[A,_ ]|L], [A|P]) :-foo(L ,P).
结果表明,此代码获取列表的N个元素,例如,如果我们提供以下查询:
?foo([[car],[house],[man]],X)
X= [c,h,m]
一开始读到这里,我发现有些问题。对于我来说,此代码获取了列表的最后一个元素和列表的第一个元素的剩余部分,因此我认为首次扩展将是(trace)。
foo([[house],[man]], ar)
foo([[man]], ouse)
foo([], an)
false.
我尝试使用swi-prolog编译并得到以下跟踪信息:
[trace] ?- trace,foo([[car],[house],[man]],X).
Call: (9) foo([[car], [house], [man]], _1016) ? creep
Fail: (9) foo([[car], [house], [man]], _1016) ? creep
false.
我哪里做错了吗?
[A|P]
,我们此刻正在构建一个列表(假设我们是朝这个方向读取的),因此A
是结果的第一个元素,而P
则是尾部(剩余列表)。你在问题中实际上自己写了[A|P]
这一部分。 - Willem Van OnsemX=[c,h,m]
部分。 - Willem Van Onsem