我如何确定序言“复合词”内部是否有特定的“原子”?

pii*_*_ke 2 prolog

我想要一个谓语来判断某个特定的原子(例如x)是否出现在复合术语内部,无论嵌套的深度如何。

我试图阅读在https://www.swi-prolog.org/pldoc/man?section=manipterm上给出的谓词。我认为这将涉及使用functor/3../2回溯地使用复合词。有没有更简单的方法,或者有一些这样做的库?

Pau*_*ura 5

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标准中指定,但它是事实上的标准谓词,通常以内置谓词或库谓词的形式提供。