对于学校作业,我们应该“重新制作”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完全符合我的要求,然而,我的TA说我也可能不允许使用它:/
我怎样才能开始'重新创建'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).
答案 0 :(得分:0)
您可以使用标准term_variables/2
自定义=../2
谓词,将术语转换为列表,然后在var/1
的帮助下收集变量时递归遍历列表标准谓词。