2014-12-02 25 views
1

一句我有一個列表L創建爲:搜索在序言

atomic_list_concat(L,' ', 'This is a string'). 

L = ['This',is,a,string] 

現在我想使用成員函數來搜索一個原子升。 我想:

?- member(' is',L). 
L = [' is'|_G268] . 

?- member(is,L). 
L = [is|_G268] . 

它是什麼,我做錯了什麼?

回答

1

儘管dasblinkenlight發佈的解決方案是正確的,但它在某種程度上破壞了使用Prolog頂層的交互性。通常,您希望將您的下一個查詢基於以前的解決方案。

由於這個原因,有可能通過編寫reuse top-level bindings$Var其中Var是在先前的查詢中使用的變量的名稱。

你的情況:

?- atomic_list_concat(L, ' ', 'This is a string'). 
L = ['This', is, a, string]. 
?- member(' is', $L). 
false. 
?- member('is', $L). 
true ; 
false. 

PS:請注意,搜索' is'時,因爲分離是由atomic_list_concat/3刪除你不會得到一個結果。

1

交互式運行的Prolog謂詞不包含狀態。當您運行

atomic_list_concat(L,' ', 'This is a string'). 

解釋說明你L賦值,然後忘記它的價值。當您在下一行運行member/2時,L將回到其自由變量狀態。

如果你想在同一L結轉,你需要保持同樣的請求中,像這樣:

:- atomic_list_concat(L,' ', 'This is a string'), 
    member(is, L), 
    writeln('membership is confirmed'). 

現在從atomic_list_concatL任務是提供給member/2,讓它檢查會員。

+0

謝謝!它有幫助。 – na899 2014-12-02 18:52:37

+0

哦!再次感謝,我是prolog和stackoverflow的新手。所以任何提示都很有用。 我有另一個問題,但我相信我不能給特定用戶標記答案。我可以嗎? – na899 2014-12-02 20:05:55

+1

我已經發布了另一個與序言相關的問題。 http://stackoverflow.com/questions/27258188/prolog-eliminating-cycles-from-indirect-relation 請看看。 – na899 2014-12-02 20:23:22