为什么该程序在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).
首先,我必须删除代码行:-sure_loaded(p31)。否则标记一个错误,指出该错误不存在。
第二,当我使用?-goldbach(4,X,Y)在SWI-Prolog屏幕上运行它时。标记了一个错误:
错误:参数没有被充分实例化
为什么?
有人可以帮我修复该程序吗?
谢谢。
答案 0 :(得分:2)
观察到goldbach/2
是所定义的谓词,它使用辅助谓词goldbach/3
。当满足goldbach/3
上的某些条件时,goldbach/2
由N
调用,以计算doubleton L
,使用3作为辅助参数{{1}的初始值},共P
。
实际上,您可以看到goldbach/3
总是在实例化其第一和第三参数的情况下被调用。在goldbach/3
的文档中,第一个参数的要求很清楚,该文档将其标记为+;当goldbach/2
调用其助手goldbach/2
进行计算时,将提供第三个参数。
像goldbach/3
这样的调用失败,因为它试图执行涉及未实例化变量的算术(goldbach(4, X, Y)
),这会导致错误:逻辑变量的算术对Prolog没有意义。需要说明的是,该程序应该可以正常运行,但是您不应直接调用Q is N - P
。
就目前而言,谓词goldbach/3
丢失了。您删除的is_prime/1
指令正在查找将在此开发中定义此谓词的文件。