我正在努力学习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
但我无法理解如何检查并打印所有数字。
答案 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.