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