学习prolog

pit*_*ohn 3 prolog

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

例如我有这个

a(b(1)).
a(b(2)).
a(b(3)).
a(b(4)).
a(b(6)).
Run Code Online (Sandbox Code Playgroud)

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

如果我没有错,我可以找到使用它的偶数

a(b(X)) mod 2 =:= 0
Run Code Online (Sandbox Code Playgroud)

但我不明白如何检查它并打印所有数字.

Tha*_*dis 7

在序言中一个非常基本的概念是模式匹配
也有很多教程解释它,像一个
,你可能还需要检查第二章的第一和休息.

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

我想打印所有具有特定属性的X.
让我们先描述一下这个属性.

X具有属性,如果它属于数据库是偶数

has_attribute(X):-
    belongs_db(X),
    is_even(X).
Run Code Online (Sandbox Code Playgroud)

如果有一个子句a(b(X)),X属于数据库

belongs_in_db(X):-
    a(b(X)).
Run Code Online (Sandbox Code Playgroud)

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

is_even(X):-
    0 =:= X mod 2.
Run Code Online (Sandbox Code Playgroud)

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

findall(X,has_attribute(X),List).
Run Code Online (Sandbox Code Playgroud)

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

writeln(List)
Run Code Online (Sandbox Code Playgroud)

所以,最后:

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

has_attribute(X):-
     a(b(X),
     0 =:= X mod 2.
Run Code Online (Sandbox Code Playgroud)

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

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

my_print_list([]).
Run Code Online (Sandbox Code Playgroud)

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

my_print_list([Head|Tail]):-
    writeln(Head),
    my_print_list(Tail).
Run Code Online (Sandbox Code Playgroud)