2015-06-13 34 views
1

我試圖在Prolog中編寫一個將列表翻譯爲另一個列表的簡單代碼。例如,如果我們撥打listtrans([a,b,c],L)L將變爲[1,2,3]。 (a,b,c被1,2,3替換)。但是我在最後一行遇到了語法錯誤。問題是什麼?這裏是我的代碼:在序言中將列表翻譯爲另一個列表

trans(a,1). 
trans(b,2). 
trans(c,3). 

listtrans([],L). 
listtrans([H|T],L1):- 
    trans(H,B), 
    append(B,L,L2), 
    listtrans(T,L2). 

回答

1

的錯誤很可能因爲在你的代碼:

listtrans([H|T],L1):- 
    trans(H,B), 
    append(B,L,L2), 
    listtrans(T,L2). 

變量L1在頭聲明,但沒有在任何地方提到:你拼寫錯誤的東西嗎?

無論如何,你的代碼不會工作。

此外,使用append/3爲這種容易定義遞歸的任務被認爲是可怕的(也因爲你的表現不好)。

將函數應用於列表很簡單。您已經知道,在序言中,您不會編寫Y = f(X),而是將函數關係聲明爲XY,如下所示:f(X, Y).。 (這基本上是你用trans(X,Y)所做的)。

現在的(容易)遞歸形式:

  • 轉化的空列表是空列表
  • [X|Xs]轉化爲[Y|Ys]如果trans(X,Y)我們遞歸變換XsYs

或以序言表示:

listtrans([],[]). 
listtrans([X|Xs],[Y|Ys]) :- trans(X,Y), listtrans(Xs,Ys). 

我建議你閱讀Learn Prolog Now的前4章,以更好地理解這些概念。

1

沒有語法錯誤,只有語義錯誤。這是它,更正:

listtrans([],[]). 
listtrans([H|T],L1):- 
    trans(H,B), 
    append([B],L2,L1), 
    listtrans(T,L2). 

但這不是序言式。其中一個寫道:

listtrans([],[]). 
listtrans([A|As],[I|Is]):- 
    trans(A,I), 
    listtrans(As,Is). 

請注意,在Prolog中明確附加元素比在支持函數的語言中要少得多。作爲一個額外的獎勵,你現在可以使用的關係,在兩個方向:

?- listtrans([a,b,c],Is). 
Is = [1,2,3]. 

?- listtrans(As, [1,2,3]). 
As = [a,b,c]. 

而且你可以在此更緊湊寫:

listtrans(As, Is) :- 
    maplist(trans, As, Is). 

更多見this

相關問題