Prolog 谓词中列表元素的计数

Prolog 谓词中列表元素的计数,prolog,Prolog,我有这样的想法: plane(1, 2, aaa, b([1,2,3,4]), 3). /* Let's pretend that you do not need other parameters */ plane(_, _, _, B_list, _) :- /* This assigns the content of the list inside b(...) to List */ B_list = b(List), length(List, N), wr

我有这样的想法:

plane(1, 2, aaa, b([1,2,3,4]), 3).
/* Let's pretend that you do not need other parameters */
plane(_, _, _, B_list, _) :-
    /* This assigns the content of the list inside b(...) to List */
    B_list = b(List),
    length(List, N),
    write(N),
    nl.
我可以访问平面的元素并像上面一样显示它,但问题是
b([1,2,3,4])

如何访问它来计算该列表中的元素数?

如果这些
平面的格式总是相同的,那么您可以通过模式匹配(统一)将
b
中的列表绑定到一个变量,然后检查长度(用法
count\u in\u平面(+,-)
,即提供
P
,获取
L
):


假设您已将参数编号4与变量
B_list
统一起来。如果要从列表内部获取列表,请使用统一运算符
=
,如下所示:

plane(1, 2, aaa, b([1,2,3,4]), 3).
/* Let's pretend that you do not need other parameters */
plane(_, _, _, B_list, _) :-
    /* This assigns the content of the list inside b(...) to List */
    B_list = b(List),
    length(List, N),
    write(N),
    nl.
这将简单地打印4。

,如:

count( plane(_,_,_, b(List), _), R ) :- length(List, R).

平面的格式是:平面(ID,ID2,名称,ListFoid,数字)。不能直接使用:平面(1, 2,AAA,[1,2,3,4],3)。如果计算该列表的元素是一个频繁操作,考虑将你的表示改变为计数,例如从<代码> B(列表)< /代码>到<代码> B。(N,列表)
。如果列表是增量构造的,这应该很容易。在最初的问题中,平面是一个事实,而不是一条规则。@pasabaporaqui我不太清楚OP在大计划中试图做什么,所以我认为我的答案是从内到外。另一方面,看起来答案解决了OP的问题,这是对我来说是很重要的…但是将write放入定义中会使程序很难测试…@false这是真的。然而,整个代码片段是一段一次性代码,用来显示它的第4行,
B_list=B(list)
,“拉”将列表转换为一个单独的变量,我认为这是OP解决更大问题的障碍。我确实同意,有副作用的规则更难测试。它至少使理解整个关系点更加困难了一步。