2016-11-20 156 views
2

美好的一天,Prolog的樹遍歷

我想寫給定一個樹的一個仿函數Prolog的程序:

start(a(f,2,9), X). 

我想它,使其產生正方形內的任何值:

X = a(f,4,81). 

我有一個代碼,已在列表中正常工作的數字。 這是我到目前爲止有:

start([],[]). 
start(Tree, []) :- Tree =.. [P|C], write(P), nl, write(C), nl, squareMe([P|C], []). 
squareMe([X|T], [Y|Result]) :- % I think the problem is here 
    atom(X), 
    Y=X, 
    squareMe(T, Result). 
squareMe([X|T], [Y|Result]) :- 
    number(X), 
    Y is X * X, 
    squareMe(T, Result). 
squareMe([], []). 
當代碼寫入P和C,我通過金大運營商處獲得正確的價值觀,但它似乎裏面squareMe要失敗

當我調用squareMe([P | C],[]),我的理解是P = a和C = [F,2,9]。原子(a)不應該是真的嗎?它似乎並非如此,我不知道爲什麼?

我使用跟蹤/ notrace跟蹤我的路試,但它肯定是高興地看到,被傳遞到squareMe值。那可能嗎?我正在使用SWI-Prolog。

TIA, COSON

回答

1

這是一個答案,而不是僅僅是因爲它是太長了評論;雖然我不完全瞭解你的問題。

要獲得解決方案向您展示在上面的查詢,這將是足夠寫:

start(a(f, X, Y), a(f, XX, YY)) :- 
    XX is X*X, 
    YY is Y*Y. 

就是這樣:

?- start(a(f, 2, 9), X). 
X = a(f, 4, 81). 

這是太簡單了,更重要的是,我在這裏看不到任何樹狀結構,這就是爲什麼我確信我誤解了這個問題。按照你所顯示的代碼,我肯定會遇到麻煩。你應該編輯你的問題來解釋:

  • 你在哪裏遍歷樹結構?
  • 您是否在使用列表,單項,嵌套項(樹?)
  • 您的謂詞是否必須雙向工作,因此,您應該能夠詢問:?- start(X, Y).例如。