Prolog 如何知道列表中的元素是奇数还是偶数?

Prolog 如何知道列表中的元素是奇数还是偶数?,prolog,Prolog,我编写了两个谓词来确定组成prolog列表的元素是奇数还是偶数,但它不起作用。为什么? odd([X]):- (X mod 2) = 0. odd([T|Q]):- (T mod 2) = 0, odd(Q). 它不起作用,因为: 最重要的是:=检查统一性。它不会计算,这意味着0和(X mod 2)永远不能相等。使用=:=比较算术术语,计算两侧,或者如果只需要计算右侧,则使用is 你把偶数和奇数搞混了。模2的奇数应为1 另外:您没有空列表的模式。但第二条规则已经涵盖了第一条规则,因此可以直接

我编写了两个谓词来确定组成prolog列表的元素是奇数还是偶数,但它不起作用。为什么?

odd([X]):- (X mod 2) = 0.
odd([T|Q]):- (T mod 2) = 0, odd(Q).

它不起作用,因为:

  • 最重要的是:
    =
    检查统一性。它不会计算,这意味着0和(X mod 2)永远不能相等。使用
    =:=
    比较算术术语,计算两侧,或者如果只需要计算右侧,则使用
    is
  • 你把偶数和奇数搞混了。模2的奇数应为1
  • 另外:您没有空列表的模式。但第二条规则已经涵盖了第一条规则,因此可以直接替换
以代码形式组合:

odd([]).
odd([T|Q]):- 1 is (T mod 2), odd(Q).
示例:

?- odd([4]).
false.
?- odd([3]).
true.
?- odd([3,5]).
true.
?- odd([3,6]).
false.

它不起作用,因为:

  • 最重要的是:
    =
    检查统一性。它不会计算,这意味着0和(X mod 2)永远不能相等。使用
    =:=
    比较算术术语,计算两侧,或者如果只需要计算右侧,则使用
    is
  • 你把偶数和奇数搞混了。模2的奇数应为1
  • 另外:您没有空列表的模式。但第二条规则已经涵盖了第一条规则,因此可以直接替换
以代码形式组合:

odd([]).
odd([T|Q]):- 1 is (T mod 2), odd(Q).
示例:

?- odd([4]).
false.
?- odd([3]).
true.
?- odd([3,5]).
true.
?- odd([3,6]).
false.