Prolog 学习序言

Prolog 学习序言,prolog,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 但是我不知道如何检查和打印所有的数字。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

但是我不知道如何检查和打印所有的数字。

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

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

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

X的属性为if 它属于数据库 甚至

如果存在子句a(b(X)),则X属于数据库

如果与2除法的余数为0,则X为偶数:

is_even(X):-
    0 =:= X mod 2.
现在我们可以询问has_属性(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.
另一方面,您可能希望以其他方式打印数字。 为此,您应该使用

如果列表是空的,我就完成了

my_print_list([]).
如果列表有一个haed和tail,我将打印第一个元素,然后打印tail:

my_print_list([Head|Tail]):-
    writeln(Head),
    my_print_list(Tail).
是偶数(N):- 0=:=N模2。 所有偶数:- a(b(X)), 是偶数(X), 写入n(X), 失败。 都是偶数。
my_print_list([]).
my_print_list([Head|Tail]):-
    writeln(Head),
    my_print_list(Tail).
is_even(N) :- 0 =:= N mod 2. all_even_number :- a(b(X)), is_even(X), writeln(X), fail. all_even_number.