我开始为即将到来的考试学习,而且我仍然坚持一个微不足道的prolog练习题,这不是一个好兆头lol.
这应该很容易,但由于某种原因,我现在无法弄明白.
任务是简单地计算prolog中Int列表中的奇数的数量.我在哈斯克尔很容易做到,但我的序言太可怕了.有人可以告诉我一个简单的方法,并简要解释你做了什么?
到目前为止,我有:
odd(X):- 1 is X mod 2.
countOdds([],0).
countOdds(X|Xs],Y):-
?????
Run Code Online (Sandbox Code Playgroud)
你对odd/1的定义很好.
空列表的事实也没问题.
在递归子句中,您需要区分奇数和偶数.如果数字是奇数,则应增加计数器:
countOdds([X|Xs],Y1) :- odd(X), countOdds(Xs,Y), Y1 is Y+1.
Run Code Online (Sandbox Code Playgroud)
如果数字不是奇数(=偶数),则不应增加计数器.
countOdds([X|Xs],Y) :- \+ odd(X), countOdds(Xs,Y).
Run Code Online (Sandbox Code Playgroud)
其中\+表示否定为失败.
或者,你可以使用!在第一个递归子句中,并在第二个中删除条件:
countOdds([X|Xs],Y1) :- odd(X), !, countOdds(Xs,Y), Y1 is Y+1.
countOdds([X|Xs],Y) :- countOdds(Xs,Y).
Run Code Online (Sandbox Code Playgroud)