作者:空灵一_一_379 | 来源:互联网 | 2023-01-03 10:17
我给你一个开始:
让我们先从创建上回溯,得到所有自然数谓语单与每个解决方案这样的数字:
natnum(0).
natnum(N) :-
N #= N0 + 1,
natnum(N0).
示例查询:
?- natnum(N).
N = 0 ;
N = 1 ;
N = 2 ;
N = 3 ;
etc.
然后,我们观察到我们可以通过限制每对的总和来生成这样的对而不会陷入无限循环.例如:
pair(A-B) :-
natnum(N),
N #>= A + B,
A #>= 0,
B #>= 0,
label([A,B]).
示例查询:
?- pair(P).
P = 0-0 ;
P = 0-0 ;
P = 0-1 ;
P = 1-0 ;
P = 0-0 ;
P = 0-1 ;
P = 0-2 ;
P = 1-0 ;
P = 1-1 ;
P = 2-0 ;
P = 0-0 ;
P = 0-1 ;
P = 0-2 ;
P = 0-3 ;
P = 1-0 ;
P = 1-1 .
这显然不是完美的:例如,冗余地报告了一些对.但是,一般的想法应该是明确的:使用一个好的构建块来控制对的生成.
1> mat..:
我给你一个开始:
让我们先从创建上回溯,得到所有自然数谓语单与每个解决方案这样的数字:
natnum(0).
natnum(N) :-
N #= N0 + 1,
natnum(N0).
示例查询:
?- natnum(N).
N = 0 ;
N = 1 ;
N = 2 ;
N = 3 ;
etc.
然后,我们观察到我们可以通过限制每对的总和来生成这样的对而不会陷入无限循环.例如:
pair(A-B) :-
natnum(N),
N #>= A + B,
A #>= 0,
B #>= 0,
label([A,B]).
示例查询:
?- pair(P).
P = 0-0 ;
P = 0-0 ;
P = 0-1 ;
P = 1-0 ;
P = 0-0 ;
P = 0-1 ;
P = 0-2 ;
P = 1-0 ;
P = 1-1 ;
P = 2-0 ;
P = 0-0 ;
P = 0-1 ;
P = 0-2 ;
P = 0-3 ;
P = 1-0 ;
P = 1-1 .
这显然不是完美的:例如,冗余地报告了一些对.但是,一般的想法应该是明确的:使用一个好的构建块来控制对的生成.
谢谢!我根据你的回答编写了我想要的代码,然后将其编辑到问题体中.