检查列表中的仿函数
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
如果我有这个:
?: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