2015-10-17 46 views
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). 

回答

0

可以定義一個term_variables/2使用標準=../2到一個術語轉換到一個列表,然後遞歸遍歷列表,同時與var/1標準謂詞的幫助下收集變量謂語自己。

+0

謝謝!我完全忘了= ../2這正是我正在尋找的東西。 – Perdite