使用Prolog打印偶数

4
我该如何在Prolog中仅打印偶数?这是我打印从3到1的数字的代码: 另一个示例中如何使用mult而不使用(*):
predicates
    count(integer).
clauses
    count(1) :- write(1), nl, !.
    count(X) :- X > 1, write(X), nl, X1 = X-1, count(X1), !.

1
如果你想打印偶数,这个X>1,write(X)是相当错误的。它会打印任何大于X的数字,其中包括3。 - Shevliaskovic
2个回答

1
如何在Prolog中打印偶数?
?- between(1, 3, X), X mod 2 =:= 0.
X = 2.

1

DMITRY MALIKOV提供了一种简洁明了的方法。下面这个方法只是在已有的方法基础上进行了改进:

predicates
    count(integer).

clauses
    count(X) :-
        X /\ 1 =:= 1, !,  % Using bitwise AND (/\) to check for odd
        X1 is X - 1,
        count(X1).
    count(X) :-
        X > 1,
        write(X), nl,
        X1 is X - 2,
        count(X1).

| ?- count_even(7).
6
4
2

我使用了按位与(/\)来检查数字的奇偶性,只是为了说明一种不同的方法。 mod 运算符同样有效。

请注意,在 Prolog 中进行算术表达式赋值时,您需要使用 is 而不是 =is 将计算右侧的表达式,并将结果统一到左侧未实例化的变量上。 = 不会评估表达式。


mbratch,您在integer(X)和X /\ 1中的意思是什么?请帮助我,因为我是Prolog编程的新手。 - eleen
并且发现了这个错误(未声明的谓词或拼写错误),并指向integer(X)。 - eleen
@eleen 抱歉,integer只适用于某些 Prolog 解释器。我使用 GNU,它有 integer。我刚刚将其删除了。这是一种防御性检查,以确保传递的是整数。由于您正在使用 Turbo Prolog 并将类型声明为“integer”,因此实际上不需要它。 - lurker
@eleen,“/\”操作符是按位与运算符。这只是另一种确定奇偶性的方法。一个奇数将具有1作为其第一个位。因此,X/\1=:=1就像说X mod 2=:=1。我决定使用它来展示一种替代方法。 - lurker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接