2017-05-12 39 views
0

我想實現在序言遞歸程序。我對如何用C這樣的過程語言實現它有一個想法,但不知道如何在序言中做到這一點。遞歸程序C至Prolog的

我怎麼會做它在C:

int function_1(int m){ 

    int i, a; 

    if(check_solution(m)) 
    return 1; 

    for(i=0; i<10; i++){ 

    a=function_2(i); 

    if (function_1(a)) 
     return 1; 
    } 

    return 0; 
} 

function_2和check_solution都是非遞歸函數。

我有一個很難進入解決問題的序言的方式,所以任何幫助將不勝感激。

+0

什麼是您的函數返回時循環到達終點? 'function_2'看起來如何? check_solution呢? C中的工作實現將有所幫助。 – dasblinkenlight

+0

@dasblinkenlight我意識到剛纔我已經失蹤function_1的返回值,我已經添加它。關於函數2和check_solution,它們都是非遞歸的。 –

+0

我會建議從簡單的事情開始。像1)如何將一個函數轉換成一個Prolog謂詞。 2)如何在Prolog中編寫*簡單的*遞歸(無循環),3)如何模擬一個循環。那麼你可以將這些結合在一起 –

回答

0

很多時候,解決的Prolog問題的最好辦法是重新考慮它的序言。然而,一些問題本質上最適合一種必要的方法,這就是C所擅長的語言。在不瞭解功能解決的實際問題的情況下,我們遺憾地將C函數轉換爲Prolog。在Prolog中必須解決的一個問題並不能真正爲您提供Prolog解決問題的方式(聲明式)。但這裏所呈現的C函數的Prolog的一個再現:

predicate_1(M) :- 
    ( check_solution(M) 
    -> true 
    ; between(1, 10, X), 
      predicate_2(X, A), 
      ( predicate_1(A) 
      -> ! 
      ; fail 
      ) 
    ). 

在這種情況下,predicate_1/1失敗(對應於return 0)或成功(對應於return 1)。我假設check_solution/1寫入成功與「迴歸truthy」,並失敗與「回報falsey」。最後,我希望predicate_2/2總是成功並實例化A的東西。