2016-07-06 72 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. 

但請注意,此代碼存在嚴重缺陷。例如。它將計算值(階乘)與計算值的輸出進行混合。我將這些修復留給你。