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

List Prolog,检查列表中是否出现一对元素,list,if-statement,search,prolog,List,If Statement,Search,Prolog,给定一个列表,我想看看列表中是否出现一对p。如果找到元素,则打印*找到* 例如: 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

给定一个列表,我想看看列表中是否出现一对
p
。如果找到元素,则打印
*找到*

例如:

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).

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

  • 案例1:列表以给定的一对开始。在这种情况下,我们完成了

  • 案例2:否则我们需要继续在列表的尾部搜索

可以这样写:

如果您希望在成功的情况下输出消息
*Found*
,我建议将其重新定位到调用谓词,例如您的谓词
搜索对/2

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

如您所见,
*Found*
仅在成功的情况下显示。这是因为,如果(P,L)中的目标
pair_失败,Prolog将不会继续下一个目标,因为该规则将不再为真。

我正在搜索一个连续的pair,这可能是重复的,问题是:/第6行有语法错误,缺少一个结束paren和一个逗号。另外,“first”没有定义,我假设您的最后一行应该调用search\u pair/2,而不是search\u pair/3,这也是未定义的。这比您所做的要容易得多。您可以将至少包含两个元素的列表描述为,
[X,Y | T]
,其中
T
是列表的其余部分(可能为空
[]
)。除第一个元素外,该列表的其余部分是
[Y | T]
。不要将副作用与实际的程序逻辑混为一谈。OP询问“if”,可能是指
if
   ?- pair_in((2,5),[3,1,2,5,4,7]).
yes
   ?- pair_in((2,4),[3,1,2,5,4,7]).
no
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