2012-08-29 88 views
3

我試圖執行一個計劃般map功能,即實現地圖功能

map([X1, X2, ..], Fun) ->[Fun(X1), Fun(X2), ...] 

我寫了這個代碼:

map([], Fun, []). 
map([H|T], Fun, [HO|TO]) :- call(Fun, H, HO), map(T,F,TO). 

現在,看着這樣運行:

?- map([1,2,3], plus(1), X). 
X = [2, 3, 4] ; 
X = [2, 3, 4] ; 
X = [2, 3, 4] ; 
X = [2, 3, 4] ; 
ERROR: map/3: Arguments are not sufficiently instantiated 
    Exception: (9) map([3], _G380, _G351) ? 
  1. 如何在第一次後停止提供?
  2. 如何跟蹤它?如果我使用trace它會在第一個解決方案後停止執行。
+0

'SWI-Prolog的版本5.10.4爲i386' – Aslan986

+0

需要注意的是SWI-Prolog有一個'maplist'謂詞,你想要做什麼。 –

回答

6

1)您發佈的代碼有問題:map(T,F,T0)應該是map(T,Fun,T0)。沒有這個變化,我會立即得到你提到的錯誤;這一修正完美無缺地運行。 (它也是改變map([], Fun, [])map([],_Fun,[])一個好主意,因爲你不使用的變量Fun - 你應該得到的單變量的警告)當您跟蹤它並達到第一個解決方案,按;

2)。或者,在swi-prolog中,按spacebar而不是enter,跟蹤將繼續。

6 ?- trace. 
true. 

[trace] 6 ?- X = 1 ; X = 2. 
    Call: (7) _G522=1 ? creep 
    Exit: (7) 1=1 ? creep 
X = 1 ; 
    Call: (7) _G522=2 ? creep 
    Exit: (7) 2=2 ? creep 
X = 2. 
+0

謝謝你的幫助。我改變了'F'''樂趣'。它不再給我那個錯誤,但它仍然給我提供了不止一個解決方案(總是一樣的,正確的,但重複)。我真的不明白爲什麼。 – Aslan986

+0

你可以試試這個:添加到代碼foo(_,42)。然後運行map([1,2,3],foo,X)和map([1],foo,X )'這很奇怪,我也跑5.10.4。你在Linux上?在任何情況下,你都可以用一個包裝謂詞來修復它:'map_w(X,Y,Z): - 一次(map(X,Y,Z))' –

+0

是的,我在Linux上。感謝您的幫助。 – Aslan986