【问题标题】:ERROR: Undefined procedure: (+)/2错误:未定义的过程:(+)/2
【发布时间】:2012-06-11 08:41:19
【问题描述】:

我是 SWI-Prolog 的新手,我想检查 Prolog 中的素数功能。

prime(N) :-
    N > 1,
    M is N - 1,
    check(N, M).

check(_, 1).
check(N, M) :-
    M > 1,
    R is N - M * N / M,
    R > 0,
    P is M - 1,
    check(N, P).

但是当我在 Prolog 中询问 2 + 2 或其他运算符(如 (*)/2(/)/2、...)时,它会说:undefined procedure: (+)/2。 我认为它适用于seetell。我重新分配了see(user)tell(user),但此错误再次发生。 为什么?

【问题讨论】:

  • 无法在 SWI-Prolog 5.10.1 上重现。您是否尝试在全新、干净的 Prolog 环境中运行它?
  • 您显示的代码不会出现错误,这在语法上似乎是正确的。在“命令行”(称为 REPL)上,也许您应该输入类似 ?- X is 2+2.

标签: prolog primes


【解决方案1】:

在您使用的 SWI prolog 6.0.2 除法中,它返回浮点数。因此,例如prime(13) 将失败,因为余数为 0。整数除法使用运算符 //。但是检查 prolog SWI 函数 remmod

您还想在check 的第一个定义之后进行剪切,否则 prolog 将探索第二个定义,这将返回 false。 Cut 确保在检查所有小于 N 的自然数后,它会成功停止。

这是在 SWI Prolog 6.0.2 中按预期运行的更正代码。

prime(N) :-
    N > 1,
    M is N - 1,
    check(N, M).

check(_, 1) :- !.
check(N, M) :-
    M > 1,
    R is N mod M,
    R > 0,
    P is M - 1,
    check(N, P).

【讨论】:

    【解决方案2】:

    关于您的错误,请查看:

    ?- 2+2.
    ERROR: Undefined procedure: (+)/2
    
    ?- X is 2+2.    
    X = 4 
    

    您应该在 Prolog 中使用is 来强制计算算术表达式。尝试在 SWI-Prolog 的提示符下输入“help(is).”。

    但是您的算法效率非常低,主要有两个原因。首先,您检查候选数字是否可以被其前面的所有数字整除,而只有那些不大于其平方根的数字就足够了(如果a*b=na >= sqrt(n) 然后b =< sqrt(n))。

    然后,您以相反的顺序进行测试。较小因素的倍数比较大因素的倍数要频繁得多,因此当按升序完成时,测试会更早地被中断,从而使整个程序运行得更快很多。最后,除了 2 之外,不需要任何偶数测试:

    prime(2).
    prime(N) :- N > 1,
        N mod 2 > 0,              % is odd
        M is floor(sqrt(N+1)),    % round-off paranoia 
        check(N, M, 3).
    
    check(N, M, F) :- F>M.
    check(N, M, F) :- F=<M,
        N mod F > 0,
        F1 is F + 2,              % test by odds only
        check(N, M, F1).
    
    primesFromTo(F,T,X):-
      between(F,T,X), prime(X).
    

    【讨论】:

      【解决方案3】:

      您提到了seetell:这些是非常老式的内置谓词。最好避开它们。使用[file] 加载文件,使用make 重新加载文件。

      有关测试素数的更好实施,请参阅this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        • 2014-08-30
        • 2017-09-09
        • 2020-05-28
        • 2017-11-01
        • 2023-03-25
        相关资源
        最近更新 更多