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 的帮助下收集变量时递归遍历列表=] 标准谓词。
对于一项学校作业,我们应该 '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 的帮助下收集变量时递归遍历列表=] 标准谓词。