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).
答
实际的关系很容易描述。有两种情况:
情况1:该列表以给定对开始。在这种情况下,我们完成了。
情况2:否则,我们需要继续搜索列表的尾部。
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
[Prolog - 如何检查列表是否包含某些元素?]的可能的重复(http://*.com/questions/5188084/prolog-how-to-check-if-a-list-includes-certain -elements) –
我正在寻找连续的对,这是事情:/ –
你有第6行的语法错误,缺少一个关闭paren和一个逗号。此外,'第一'没有定义,我假设你最后一行应该调用search_pair/2而不是search_pair/3,这也是undefined – vmg