2016-07-06 122 views
0

我想下面从http://www.dailyfreecode.com/code/prolog-find-factorial-given-number-3072.aspx在SWI-Prolog的结构化的代码运行:结构的Prolog代码没有运行

predicates 
    start 
    find_factorial(real,real) 

goal 
    clearwindow, 
    start. 

clauses 
    start:- 
     write("Enter non negative number = "), 
     readreal(Num), 
     Result = 1.0, 
     find_factorial(Num,Result). 

    find_factorial(Num,Result):- 
     Num <> 0, 
     NewResult = Num * Result, 
     NewNum = Num - 1, 
     find_factorial(NewNum,NewResult). 

    find_factorial(_,Result):- 
     write("Factorial = ",Result),nl. 

但有3个“语法错误:运营商有望”启动时,它不运行:

?- start. 
ERROR: toplevel: Undefined procedure: start/0 (DWIM could not correct goal) 

问题在哪里,我该如何运行这样的代码?

+3

这个所谓的“结构化代码”是使用Visual(或Turbo或PDC)Prolog特定语言结构编写的。它不会像SWI或GNU Prolog那样运行。 – lurker

+0

我明白了。我没有意识到这一点。谢谢。 – rnso

回答

0

要你的代码移植到Prolog的,去掉predicates部分,转换goal部分为标准initialization/1指令:

:- initialization(start). 

删除也是clauses节头。您还需要移除子句体内的部分调用(未经测试):

start:- 
    write('Enter non negative number = '), 
    read(Num), 
    Result = 1.0, 
    find_factorial(Num,Result). 

find_factorial(Num,Result):- 
    Num > 0, 
    NewResult = Num * Result, 
    NewNum = Num - 1, 
    find_factorial(NewNum,NewResult). 

find_factorial(_,Result):- 
    write('Factorial = '), write(Result), nl. 

但请注意,此代码存在严重缺陷。例如。它将计算值(阶乘)与计算值的输出进行混合。我将这些修复留给你。