2
對於一個學校任務,我們應該「重拍」unify_with_occurs_check/2,而不使用任何其他與發生檢查直接相關的內置謂詞或聲音統一,以便它有點像這樣的:Prolog製作函數中的術語列表
?- 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.
但這些都需要變量「條款」,一次被綁定到多個方面(但不屬一列表),從而導致錯誤。
所以我需要做一些將(動態)函數中的所有變量列表。
我發現term_variables/2這不正是我想要的,但是,我的TA說我也可能不允許使用:/
我怎麼能開始「重新創建」 term_variables/2
?
編輯 - 解決:
這是一個可行的解決方案,這要歸功於保羅·莫拉;
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).
謝謝!我完全忘了= ../2這正是我正在尋找的東西。 – Perdite