If statement Prolog中的这个谓词有什么问题?

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],_

所以,我要做的是查看元素是否在指定的列表中。如果是,我增加一些变量,如果我找到其中的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],_,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