检查列表中的仿函数

Checking functor in a list

如果我有这个:

?:check_dv([v(1,x),v(2,y)], X).

如何检查第二个参数是什么,例如 v(1,x)(在本例中为 x)?

一旦我有了列表的头部:[Head | Tail],和 Head = [v(1,x)],我该如何检查它?

如果你知道所有元素的形式都是v(_,_),那么你可以简单地使用统一:

Head = v(_, x)

这成功了 iff​​ Head 是这种形式,并且在所有方向上都正确工作。

如果列表的元素不是那么同质,可以使用arg/3:

arg(2, Head, x)

请注意,这仅在 Head 充分 实例化 时有效,并且仅出于这个原因已经 不太可取

?- arg(2, v(a,x), x).
true.

?- arg(2, Head, x).
ERROR: arg/3: Arguments are not sufficiently instantiated