Prolog,检查一对元素是否出现在列表中

问题描述:

给定一个列表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://*.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

实际的关系很容易描述。有两种情况:

  • 情况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