2013-08-30 50 views
1

我是新來的prolog。我已經瞭解到,雖然它是一種聲明性語言,但prolog可以用作通用編程語言,就像C一樣。因此,無論您在C中可以解決哪些問題,都可以在序言中解決,儘管它的run-時間可能不會那麼好。由於在序言中沒有指針(據我所知),我想知道如果我能在序言中寫的等效程序用C語言編寫下面的代碼: -如何在Prolog中實現指針?

#include <stdio.h> 

int main() 
{ 
    int a = 5; 
    int *p; 
    p = &a; 
    printf("The address of a is %d.", p); 
    return 0; 
} 
+1

不知道prolog,但因爲代碼顯示在'c',所以想要通知說明符'%d'不正確的指針。你應該使用'%p'或'%u'。 –

+1

你從哪裏得知Prolog可以像C一樣使用? – lurker

+0

感謝Dayal rai的信息 – user2118622

回答

3

你試圖推動使用螺絲刀的釘子,使用流行的比喻。 Prolog是不是C和序言中解決問題是解決他們在C.

打印變量的值是很容易做到本質上的區別,例如:

main :- 
    X = 5, 
    io:format("X = ~w~n", [X]). 

,但你不能得到X的地址就像你可以在C中一樣。你爲什麼想要?自從Prolog有自動垃圾收集功能後,地址可能會有所不同。

如果你想學習Prolog,忘記試圖編寫看起來像C程序的Prolog程序,並嘗試解決實際問題。例如,您可以嘗試Project Euler系列問題。

2

除了評論和現有的答案,這裏是更多:

問自己:什麼是你已經顯示了使用的C程序?它解決了什麼問題?我無法回答這個問題,我懷疑你也不能回答。孤立地說,這個程序沒有任何有用的應用程序!因此,儘管C是一種通用編程語言,但您可以編寫沒有任何目的,通用或特定領域的程序。

當然,Prolog也是如此。

特別指出:它們是一個非常簡單的對絕對內存地址的精簡抽象。你可以用很多方式來使用(和濫用)指針,並且,如果你的算法對於你當前正在解決的問題是正確的,編譯器可以生成非常高效的機器代碼。然而,Prolog也是如此。然而,範例將會非常不同。

總之,你已經設法寫出一個沒有意義的問題,你激怒我回答它沒有任何代碼。

P.S.或者你剛剛以適中的成功拉動了我們。

1

好吧,既然你標記了你的問題,我可以顯示我用Prolog引擎交換Qt GUI對象(只是指針,你知道...)的代碼。

/** get back an object passed by pointer to Prolog */ 
template<typename Obj> Obj* pq_cast(T ptr) { 
    return static_cast<Obj*>(static_cast<void*>(ptr)); 
} 

使用,例如在swipl-win,其中_read_f真的是一個C回調:

/** fill the buffer */ 
ssize_t Swipl_IO::_read_f(void *handle, char *buf, size_t bufsize) { 
    auto e = pq_cast<Swipl_IO>(handle); 
    return e->_read_(buf, bufsize); 

swipl雙贏發現其在SWI-Prolog的新的控制檯方式。

+0

對不起,由於某種原因,當我瀏覽這個答案我downvoted沒有注意到,我做了一個虛擬的編輯,以消除downvote;( – m09

+0

@Mog:謝謝,實際上我的答案不是很好,導致用例doesn' t顯示由於使用指針而成爲可能的往返行程...... – CapelliC

+0

哦,我不是故意說你的答案很糟糕,這實際上是我的錯誤;)乾杯! – m09