2010-06-04 43 views
2

我是新來的prolog,我只是無法弄清楚這一點。序言列表和參數和返回值

我想構建一個簡單的程序,它接收謂詞列表,在列表中搜索特定的謂詞,並將函數應用於謂詞的參數。

東西沿着這些路線:

?- program([pred1(a,b,p), pred2(d,b,p), pred2 (a,c,p)]). 

program (list1) :- 
search(pred2(X,Y,p),list1). 
doSomething (X,Y) % with the X and Y returned from search function, both of them. 

基本上,我想用這將從客觀search(pred2(X,Y,p),list1)回報,並利用它們對其他功能的所有值。


好吧,我試着在序言中的一些東西,來到這一點:

member(X, [X | _]). 

member(X, [_ | R]) :- member(X, R). 

prog(L1,Out) :- member(pred2(X,Y), L1). 

?- prog ([(pred1(a,b),pred2(c,b),pred2(d,a)],Out). 

它給真正的2倍,是應該的,但我希望得到Out = [c,b]Out = [d,a]。我如何實現這一目標?

關於橡樹的答案:我知道它不是一種程序性語言,但我不知道如何訪問值並在序言中使用它們。你的例子並沒有那麼有用。

回答

6

對於初學者,我會避免調用這些東西「功能」。 Prolog不是一種程序語言,規則/謂詞不是函數。

基本上,當你使用規則時,你確實在問Prolog,「給我所有滿足這個規則的值」。該規則本身不返回任何內容。

所以說你有一個過程語言如下:

f(g(3)) 

,你會怎麼做的序言?您需要編寫一些謂詞f(X,Y)和某些謂詞g(X,Y),然後您需要使用查詢f(3,Y), g(Y,Z) - 這意味着要求Prolog找到您的值爲YZ,這將滿足此要求。 Z是你感興趣的。

0

接近這些過濾器的最好方法&在我看來,prolog中的項目需求是編寫你的過濾器表達式,使得它只需要一個參數並且如果輸入參數通過過濾器就成功了 -

iseven(Num) :- 0 is Num % 2 . 

然後寫該投影代碼作爲帶一個參數是輸入,和一個作爲輸出 -

triple(NumIn, NumOut) :- NumOut is NumIn * 3 . 

然後綁在一起 -

triple_evens(NumIn, NumOut) :- iseven(NumIn), triple(NumIn, NumOut). 

然後向列表中的每個成員上運行此,我們應該使用的findall -

triple_evens_in_list(Lin, Lout) :- 
    findall(Num, (member(NumL, Lin), 
        triple_evens(NumL, Num) 
       ), LOut). 

這可以概括爲採取作爲參數,當然過濾&地圖謂詞的名稱。它也可以壓縮到一個stmt的形式 -

findall(Num, (member(M, List), 0 is M % 2, Num is M * 3), ListOut).