2017-04-27 50 views
1

給定一個列表L我想查看一對P是否出現在列表中。如果找到元素,則打印*Found*Prolog,檢查一對元素是否出現在列表中

例如:

L = [3,1,2,5,4,7]. 
P = (2,5). 

鑑於這個例子中,我應該得到*Found*作爲2,5出現在列表L第二和第三的位置。

這是我的做法,但我得到一個答案。

search_pair([_|[]],_). 
search_pair([X|T],(F,L)) :- 
    first(Y, T), 
    write('searching: '),write(F),write(' '),write(L),nl, 
    write('trying: '),write(X),write(' '),write(Y),nl, 
    ((F == L , L = Y) -> (write('Found')) 
    search_pair(T,(F,L),R). 
+0

[Prolog - 如何檢查列表是否包含某些元素?]的可能的重複(http://stackoverflow.com/questions/5188084/prolog-how-to-check-if-a-list-includes-certain -elements) –

+1

我正在尋找連續的對,這是事情:/ –

+0

你有第6行的語法錯誤,缺少一個關閉paren和一個逗號。此外,'第一'沒有定義,我假設你最後一行應該調用search_pair/2而不是search_pair/3,這也是undefined – vmg

回答

2

實際的關係很容易描述。有兩種情況:

  • 情況1:該列表以給定對開始。在這種情況下,我們完成了。

  • 情況2:否則,我們需要繼續搜索列表的尾部。

這可以用if_/3(',')/3寫成像這樣:

pair_in((X,Y),[A,B|Cs]) :- 
    if_((X=A,Y=B), 
     true,     % <- case 1 
     pair_in((X,Y),[B|Cs])). % <- case 2 

你的榜樣和反查詢此:

?- pair_in((2,5),[3,1,2,5,4,7]). 
yes 
    ?- pair_in((2,4),[3,1,2,5,4,7]). 
no 

如果你想輸出在消息*Found*在成功的情況下,我會建議將它重新定位到一個調用謂詞,例如您的謂語search_pair/2

search_pair(L,P) :-  % <- calling predicate 
    pair_in(P,L),   % <- actual relation 
    format('*Found*~n'). % <- output 

現在讓我們來查詢這個謂語用上面的例子:

?- search_pair([3,1,2,5,4,7],(2,5)). 
*Found* 
yes 
    ?- search_pair([3,1,2,5,4,7],(2,4)). 
no 

正如你可以看到*Found*只顯示在成功的情況下。這是因爲如果目標pair_in(P,L)失敗,Prolog不會繼續執行下一個目標,因爲規則不會再變爲真實。

+1

OP詢問「if」,可能意思是「if_」。 – false

相關問題