2016-11-23 73 views
1

如何在列表中創建一個術語,例如:3 * y * w * t^3:List = [3,*,y,...]而不使用以下謂詞:如何在Prolog中將術語轉換爲列表

t2l(Term, List) :- 
    t2l_(Term, List-X), 
    X = []. 
t2l_(Term, [F|X]-X) :- 
    Term =.. [F], 
    !. 
t2l_(Term, L1-L4) :- 
    Term =.. [F, A1, A2], 
    t2l_(A1, L1-L2), 
    L2 = [F|L3], 
    t2l_(A2, L3-L4). 

有沒有簡單的方法?

回答

1

在Prolog,這可以通過模式匹配應該通過模式匹配 表達來表達一切。

在你的情況,這是困難的,因爲你不能統一用圖案,您使用的是defaulty表示匹配區別於其他方面所產生的整數

在下文中,我沒有完全解決的任務給你,但我展示如何可以解決這個問題,一旦你有一個乾淨的表示

正如序言描述列表時總是考慮使用符號:

 
term_to_list(y) --> [y]. 
term_to_list(w) --> [w]. 
term_to_list(t) --> [t]. 
term_to_list(i(I)) --> [I]. 
term_to_list(A * B) --> 
     term_to_list(A), 
     [*], 
     term_to_list(B). 
term_to_list(A^B) --> 
     term_to_list(A), 
     [^], 
     term_to_list(B). 

在這個例子中,我使用i(I)象徵性代表整數  I

樣品的查詢和結果:

 
?- phrase(term_to_list(i(3)*y*w*t^i(3)), Ls). 
Ls = [3, *, y, *, w, *, t, ^, 3]. 

我離開defaulty表示轉換到一個乾淨的一個作爲一個簡單練習。

0

謝謝你的回答,我忘了關閉這個問題。但是我已經創建了一個解決問題的新謂詞:

term_string(Term, X), 
string_codes(X, AList), 
ascii_to_list(AList, Y). 

ascii_to_list([X | Xs], [Y | Out]) :- 
    X >= 48, 
    X =< 57, 
    !, 
    number_codes(Y, [X]), 
    ascii_to_list(Xs, Out). 
ascii_to_list([X | Xs], [Y | Out]) :- 
    char_code(Y, X), 
    ascii_to_list(Xs, Out). 
ascii_to_list([], []). 
+1

嘗試最普遍的查詢:' - term_list(期限,列表).'這使您只有一個* *答案,其省略了許多有效的解決方案。使用我發佈的版本,您可以使用:'? - phrase(term_to_list(T),Ls).'和**根據需要生成許多有效答案。我強烈建議儘可能使程序儘可能通用,以便真正從聲明範例中受益。 – mat