我正在努力学习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)
但我不明白如何检查它并打印所有数字.
在序言中一个非常基本的概念是模式匹配
也有很多教程解释它,像这一个
,你可能还需要检查第二章的第一和休息.
我真正喜欢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)