学习prolog

时间:2011-05-07 10:21:52

标签: prolog

我正在努力学习Prolog,我将编程知识转换为这门语言有一个非常大的问题。我无法解决真正的新手问题。

例如我有这个

a(b(1)).
a(b(2)).
a(b(3)).
a(b(4)).
a(b(6)).

如果Y是偶数,练习想要打印(使用writeln(X))所有b(Y)。

如果我没错,我可以找到它是否是偶数

a(b(X)) mod 2 =:= 0

但我无法理解如何检查并打印所有数字。

2 个答案:

答案 0 :(得分:7)

prolog中一个非常基本的概念是模式匹配 有很多教程解释它,比如this一个 您可能还想查看第二章的第一部分和其余部分。

我真正喜欢prolog的原因之一就是我只想写下我想要的东西:

我想要打印所有具有特定属性的X. 让我们首先描述属性。

X具有属性if 它属于数据库 甚至是

has_attribute(X):-
    belongs_db(X),
    is_even(X).

如果存在子句a(b(X))

,则X属于数据库
belongs_in_db(X):-
    a(b(X)).

X即使2的除法的余数为0:

is_even(X):-
    0 =:= X mod 2.

现在我们可以请求has_attribute(X)和prolog将回复,列出每个X. 但我们希望所有X.这样做我们将使用findall / 3谓词 找到具有我想要的属性的所有X并将它们放在列表中

findall(X,has_attribute(X),List).

现在我们列出了所有X,我们想要打印它们 一个简单的方法就是使用writeln / 1:

writeln(List)

所以,最后:

run:-
    findall(X,has_attribute(X),List),
    writeln(List).

has_attribute(X):-
     a(b(X),
     0 =:= X mod 2.

另一方面,您可能希望以其他方式打印数字。 为此,您应该使用recursion

如果列表为空,我就完成了

my_print_list([]).

如果列表有haed和tail我将打印第一个元素然后打印尾部:

my_print_list([Head|Tail]):-
    writeln(Head),
    my_print_list(Tail).

答案 1 :(得分:0)

is_even(N) :-
        0 =:= N mod 2.

all_even_number :-
       a(b(X)),
       is_even(X),
       writeln(X),
       fail.
all_even_number.