0

为什么这个程序在 Prolog 中不起作用?

%  Goldbach's conjecture. 
% Goldbach's conjecture says that every positive even number greater 
% than 2 is the sum of two prime numbers. Example: 28 = 5 + 23.

:- ensure_loaded(p31).

% goldbach(N,L) :- L is the list of the two prime numbers that
%    sum up to the given N (which must be even).
%    (integer,integer) (+,-)

goldbach(4,[2,2]) :- !.
goldbach(N,L) :- N mod 2 =:= 0, N > 4, goldbach(N,L,3).

goldbach(N,[P,Q],P) :- Q is N - P, is_prime(Q), !.
goldbach(N,L,P) :- P < N, next_prime(P,P1), goldbach(N,L,P1).

next_prime(P,P1) :- P1 is P + 2, is_prime(P1), !.
next_prime(P,P1) :- P2 is P + 2, next_prime(P2,P1).

首先,我必须删除代码行:- ensure_loaded(p31)。否则标记一个错误说不存在。

其次,当我使用 ?-goldbach(4,X,Y) 在 SWI-Prolog 屏幕上运行它时。标记了一个错误,上面写着:

错误:参数没有充分实例化

为什么?

有人可以帮我修复程序吗?

谢谢你。

4

1 回答 1

3

观察那goldbach/2是被定义的谓词,它使用了一个辅助谓词goldbach/3。当满足某些条件时goldbach/3调用以计算 doubleton ,使用 3 作为 的辅助参数的初始值。goldbach/2NLPgoldbach/3

事实上,你可以看到它goldbach/3总是在调用它的第一个和第三个参数时实例化。对第一个参数的要求在 的文档中很清楚,将goldbach/2其标记为 +;第三个参数是在goldbach/2调用其助手goldbach/3执行计算时提供的。

调用 likegoldbach(4, X, Y)失败,因为它试图执行Q is N - P涉及未实例化变量的算术 ( ),这会导致错误:逻辑变量的算术对 Prolog 没有意义。澄清一下,该程序应该可以正常工作,但您不应该goldbach/3直接调用。

就目前而言,谓词is_prime/1缺失。您删除的ensure_loaded/1指令正在寻找将定义此谓词的文件(在此开发中)。

于 2018-07-07T20:55:42.453 回答