findThree([H|T],_,3).
findThree([H|T], M, Z):-
( member(H,M)
-> Z2 is Z + 1,
select(H,M,C),
findThree(T,C,Z2)
;select(H,M,C),
findThree(T,C,Z)
).
所以,我要做的是查看一个元素是否在指定的列表中。如果是,我增加一些变量,如果我找到其中3个元素就停止。但是,这对我来说似乎不起作用 - 这是我的语法问题吗?我正在尝试在SWI-Prolog中使用If-else构造;这可能是问题吗?
答案 0 :(得分:1)
Z is Z + 1
总是会失败;这将计算Z + 1
的值,然后尝试将其与Z
统一。由于Z
通常与Z + 1
的值不同,is
将失败。您需要创建一个新变量Z2
,使用Z2 is Z + 1
,然后在相关位置使用Z2
代替Z
。
接受您的代码并修复:
findThree(_,_,3). % This should allow anything as the first element
findThree([H|T], M, Z) :-
select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly
findThree([_|T], M, Z) :-
findThree(T, M, Z). % Allow this second case since it simplifies the code