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

时间:2011-02-27 23:12:48

标签: if-statement prolog predicate

        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构造;这可能是问题吗?

1 个答案:

答案 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