我想要一个谓语来判断某个特定的原子(例如x)是否出现在复合术语内部,无论嵌套的深度如何。
我试图阅读在https://www.swi-prolog.org/pldoc/man?section=manipterm上给出的谓词。我认为这将涉及使用functor/3和../2回溯地使用复合词。有没有更简单的方法,或者有一些这样做的库?
Carlo的简洁答案可在SWI-Prolog上使用,但不能移植,因为该arg/3谓词的ISO Prolog标准规范(大多数Prolog系统实现)要求将其第一个参数绑定到整数,从而防止将其用作复合术语参数的可回溯生成器。一个更可移植的替代方法是:
haystack_needle(H, N) :-
H == N.
haystack_needle(H, N) :-
functor(H, _, A),
between(1, A, I),
arg(I, H, A),
haystack_needle(A, N).
Run Code Online (Sandbox Code Playgroud)
该between/3谓词未在ISO Prolog标准中指定,但它是事实上的标准谓词,通常以内置谓词或库谓词的形式提供。