编辑:正如错误指出的那样:
您找不到答案的原因是您的规则 numberpair/1 不会终止。您找不到答案的原因是 Prolog 以首先列出 A 的所有可能性然后列出 B 的可能性的方式枚举您的答案(请注意,两者都有无限的可能性)。Prolog 尝试首先为子句 numberpair(pair(A,B)) 找到答案,然后为以下子句 A=s(s(0)) 和 B=s(s(s(0))) . 但是由于 numberpair 已经不会终止,所以到目前为止它不会“到来”。
如果您更改子句目标的顺序并在 numberpair(pair(A,B)) 之前简单地调用 A=s(s(0)),它将列出 B 的可能性的所有答案(请注意,这仍然赢了'不要终止!)。
?- A=s(s(0)), numberpair(pair(A,B)).
A = s(s(0)),
B = 0 ;
A = s(s(0)),
B = s(0) ;
A = B, B = s(s(0)) ;
A = s(s(0)),
B = s(s(s(0))) .
编辑 2,还提供一个版本,它将以“公平”的方式枚举!
is_number(0).
is_number(s(N)) :-
is_number(N).
number_number_sum(0,A,A).
number_number_sum(s(A),B,s(C)) :-
number_number_sum(A,B,C).
numberpair(pair(X,Y)) :-
is_number(Z),
number_number_sum(X,Y,Z).
这将为我们提供
?- numberpair(pair(A,B)).
A = B, B = 0 ;
A = 0,
B = s(0) ;
A = s(0),
B = 0 ;
A = 0,
B = s(s(0)) ;
A = B, B = s(0) ;
A = s(s(0)),
B = 0 ;
A = 0,
B = s(s(s(0))) ;
A = s(0),
B = s(s(0)) ;
A = s(s(0)),
B = s(0) ;
A = s(s(s(0))),
B = 0 .