2016-11-25 48 views
0

在終端中詢問b序言時,成員函數似乎在將列表分配給變量並將該變量與構建在「成員」功能。我在使用變量時無法解釋結果。誰能告訴我這是否是正確的行爲,爲什麼是這樣?使用分配給變量的列表時,b-prolog成員函數的行爲可疑

B-Prolog Version 8.1, All rights reserved, (C) Afany Software 1994-2014. 
| ?- List = [a,b,c,d]. 
List = [a,b,c,d] 
yes 
| ?- member(a,List). 
List = [a|_14c] ?; 
List = [_148,a|_154] ?; 
List = [_148,_150,a|_15c] ?; 
List = [_148,_150,_158,a|_164] ?; 
List = [_148,_150,_158,_160,a|_16c] ? 
yes 

| ?- member(a,[a,b,c,d]). 

yes 
| ?- 

我使用bprolog v 8.1在Windows 10運行臨(10.0.143393建設14393)

+3

頂級請求'member(a,List).'返回所有可能的成員爲'a'的列表。這是正確的行爲。 –

回答

1

頂級查詢是獨立的,不共享變量。如果您嘗試改爲:

| ?- List = [a,b,c,d], member(a,List). 

您將獲得預期結果。

+0

好的,這很有道理,但是我如何解釋我在第一次調用中看到的結果,看起來好像是無限的,如果成員調用中不存在List,那麼奇怪的列表結構的響應是什麼? – sbarnard

+1

查看Stanislav的評論。換句話說,在這種情況下,'member/2'謂詞就像一個* generator *。即它會生成長度增加的包含原子「a」的列表。您可以將結果看作列表*模板*。因此,例如,任何在第一個位置帶有「a」的列表都是一個解決方案。該列表由術語'[a |尾巴]'尾巴'可以是任何列表。請注意,以下劃線開頭的解決方案中的所有術語都是變量。 –