If statement Prolog中的这个谓词有什么问题?
所以,我要做的是查看元素是否在指定的列表中。如果是,我增加一些变量,如果我找到其中的3个元素,我就停止。然而,这似乎对我不起作用——这是我的语法问题吗?我试图在SWI Prolog中使用If-else构造;这可能是问题所在吗If statement Prolog中的这个谓词有什么问题?,if-statement,prolog,predicate,If Statement,Prolog,Predicate,所以,我要做的是查看元素是否在指定的列表中。如果是,我增加一些变量,如果我找到其中的3个元素,我就停止。然而,这似乎对我不起作用——这是我的语法问题吗?我试图在SWI Prolog中使用If-else构造;这可能是问题所在吗 Z是Z+1对于整数总是失败;这将计算Z+1的值,然后尝试将其与Z统一。由于Z通常不具有与Z+1相同的值,因此is将失败。您需要创建一个新变量Z2,使用Z2 is Z+1,然后在相关位置使用Z2而不是Z 获取代码并进行修复: findThree([H|T],_
Z是Z+1
对于整数总是失败;这将计算Z+1
的值,然后尝试将其与Z
统一。由于Z
通常不具有与Z+1
相同的值,因此is
将失败。您需要创建一个新变量Z2
,使用Z2 is Z+1
,然后在相关位置使用Z2
而不是Z
获取代码并进行修复:
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)
).
我对prolog不太了解,但我知道“增加变量”是你不能做的事情。尝试一种更具声明性的方法(我知道这不是很有帮助)。如果我想找到一个项目,这是可行的,但对于三个项目,它失败了。通常,您不使用if-then-else子句编写Prolog,只需回溯即可。您想查找值
M
的N
副本,对吗?从你的问题描述中,我不太清楚。嗯,我想知道列表a中有多少元素在列表B中。在这种情况下,我想知道a中是否有3个元素也在B中。@Waffles:这是你程序中的第一条语句(findThree([H | t],[u3])
)实际上,您正在运行的查询?@Waffles:查看我在答案中输入的新代码;我认为它解决了问题,使事情变得更简单。
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