攻读prolog/haskell编程考试

use*_*349 1 syntax prolog

我开始为即将到来的考试学习,而且我仍然坚持一个微不足道的prolog练习题,这不是一个好兆头lol.

这应该很容易,但由于某种原因,我现在无法弄明白.

任务是简单地计算prolog中Int列表中的奇数的数量.我在哈斯克尔很容易做到,但我的序言太可怕了.有人可以告诉我一个简单的方法,并简要解释你做了什么?

到目前为止,我有:

odd(X):- 1 is X mod 2.

countOdds([],0).
countOdds(X|Xs],Y):-
?????
Run Code Online (Sandbox Code Playgroud)

Ale*_*nik 5

你对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)