Prolog 制作函数中的术语列表

Prolog making a list of terms in a function

对于一项学校作业,我们应该 'remake' unify_with_occurs_check/2 不使用任何其他与发生检查或声音统一直接相关的内置谓词,因此它的工作方式有点像这样:

?- occurs(X, f(Y,g(X))). 
true.

?- occurs(X, f(Y,g(b))). 
false.

但是,我已经尝试了好几个小时,但没有成功,而且我找不到任何关于我应该为此使用什么内置谓词的提示。

到目前为止,我已经得出以下结论:

occurs(X, Func):-
dynamic F/Count,
functor(Func, F, Count),
findall(_, Func, Terms),
member(Term, Terms),
X == Term.

occurs(X, _(Terms)):-
TermList = [Terms],
member(Term, TermList),
X == Term.

但是这些要求变量 'Terms' 一次绑定到多个术语(而不是列表),从而导致错误。

所以我需要做一些事情来列出(动态)函数中的所有变量。

我发现 term_variables/2 完全符合我的要求,但是,我的助教说我可能也不允许使用它:/

我怎么才能开始'recreate'term_variables/2

编辑 - 已解决:

这是一个可行的解决方案,感谢 Paulo Moura;

occurs(X, Func):-
\+ var(Func),
Func =.. [_ | Terms],
member(Term, Terms),
X == Term.

occurs(X, Func):-
\+ var(Func),
Func =.. [_ | Terms],
member(Term, Terms),
occurs(X, Term).

您可以自己定义一个 term_variables/2 谓词,方法是使用标准 =../2 将术语转换为列表,然后在 [=12 的帮助下收集变量时递归遍历列表=] 标准谓词。