2012-04-26 59 views
4

所以我對prolog很陌生,我想實現一個類型檢查器。我應該怎樣去做呢?這將是一個例子:如何在prolog中查看類型檢查器?

String s; int i; i = s.length(); // OK (example given in the homework) 

當我問教授怎麼會事的輸入,它會是這個樣子:

instance(s, string). 

那是偉大的,但如果這樣做,統一的我丟失在查詢的接近,所以如果我是做一個比方說,等於事實,並調用它像這樣,

equals(i, s, '.', 'length'). 

我如何檢查我是什麼。所以我很難知道從哪裏開始。它是一項家庭作業,所以只需要一些建議,幫助我理解如何開始我的第一個序言項目。提前致謝。

編輯:分配

編寫能夠鍵入檢查方法需要根據JLS給定的Java程序 一個Prolog程序。事實數據庫可以是您編寫的非平凡Java程序中所定義的任何方法的任何編碼,以及最低限度列出的方法。在查詢
模式下,它必須檢查潛在的匹配;例如允許「println(string)」。您需要 不編碼您不需要的那些JLS規則。 (給出的例子之一就是上面的例子。)

+0

在Prolog中爲像Java這樣的語言實現類型檢查器絕對不是Prolog中的第一個任務。你必須先學習Prolog! – false 2012-04-26 10:50:11

+0

這是如何用一些語言整個學期!哦,井。我同意,不是最好的學習方式。 – Andy 2012-04-26 14:16:50

+0

@Andy:請添加更多關於作業的信息,atm它不清楚問什麼,我們不能真正幫助 – m09 2012-04-26 14:51:24

回答

4

我打算以下面的內容爲出發點。這裏是我的形式化:

type(string). 

意味着字符串是一個變量可用的類型是

signature(=, [X, X, nil]). 

實例意味着管道符=需要兩個同類型的參數,並且沒有返回。

is_instance(X, Y) 

意味着XY 型要進行測試的一個實例,我創建包含在「聲明」的名單我我test/0謂詞的變量Input。然後,我遞歸測試如果事情順利。您必須將第三個子句作爲遞歸調用來查找表達式中的類型現在是否可用。

我做了什麼atm是在我的第一個主要check/2子句中,我處理instance/2條款,並在下面的其餘部分中。

:- dynamic is_instance/2. 

type(string). 
type(int). 

signature(=, [X, X, nil]). 

test :- 
    retractall(is_instance(_, _)), 
    Input = [instance(s, string), instance(i, int), =(i, length(s))], 
    check(Input, ReturnTypes), 

check([], []). 
check([instance(Variable, Type)|Terms], [nil|ReturnTypes]) :- 
    !, 
    (is_instance(Variable, _) -> syntax_error('Variable already declared') 
    ; \+ type(Type) -> syntax_error('Using a non-existing type'), 
    ; Term =.. [is_instance, Variable, Type], 
     assertz(Term)), 
    check(Terms, ReturnTypes). 

check([Term|Terms], [Type|ReturnTypes]) :- 
    Term =.. [Name|Arguments], 
    % Here we have to call ourselves with our list of arguments 
    % and then check that everything is fine and then we'll unify Type 
    % with the return value of Name. 
    check(Terms, ReturnTypes). 

我希望它能幫助您入門。

+0

哇,這很多東西我不太確定,因爲我是這種語言的新手。但是,是的,我非常感謝您提出答案的時間。儘管我對簽名感到困惑。上面你有第三個參數,無,在代碼中你沒有這個參數。我錯過了什麼嗎?但是,這又給了我一個開始做大量研究並完成作業的起點。 – Andy 2012-04-27 03:46:29