【发布时间】:2018-07-07 19:59:13
【问题描述】:
为什么这个程序在 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 屏幕上运行它时。标记了一个错误,上面写着:
错误:参数没有充分实例化
为什么?
有人可以帮我修复程序吗?
谢谢。
【问题讨论】:
-
您只需要正好两个加数,所以我不会为列表而烦恼。它只是使谓词更加麻烦。
p31是什么?请注意,is/2仅用于当第二个参数的所有变量都是已知数值时的算术评估。尝试使用 CLP(FD)。 -
? ? ?............
-
让我试试另一个问题,也许这个问题更简单,虽然我假设你从其他地方复制了这段代码,所以你不知道它是如何工作的:你为什么要打电话给
goldbach(4, X, Y)?代码注释清楚地表明顶层是goldbach/2。你应该打电话给goldbach(4, L)。 -
您可能认为
goldbach(4, X, Y)会给您X和Y中的两个素数,但事实并非如此。goldbach(4, X)将在X的列表中为您提供两个素数。 Prolog 与其他语言完全不同,您需要开始阅读逻辑编程的介绍并积极解决更简单的练习。您正在查看的是一系列复杂练习中的一个已解决的练习,它们之间存在依赖关系。 -
您的问题是关于为什么该程序不起作用以及是否可以修复它。答案已经给出:您需要调用正确的顶级谓词:
goldbach(4, L)。如果您对 Prolog 中编程的特定问题有不同的特定问题,您应该单独发布。如果你只想要这个程序的 3 参数版本,你可以写,my_goldbach(N, X, Y) :- goldbach(N, [X,Y]).并调用my_goldbach(4, X, Y).
标签: math error-handling compiler-errors prolog instantiation-error