Prolog在函数中列出术语列表

时间:2015-10-17 18:08:07

标签: prolog

对于学校作业,我们应该“重新制作”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).

1 个答案:

答案 0 :(得分:0)

您可以使用标准term_variables/2自定义=../2谓词,将术语转换为列表,然后在var/1的帮助下收集变量时递归遍历列表标准谓词。

相关问题