2016-07-08 54 views
0
工作

我想下面的代碼,其中的foreach和string_codes分別工作:的foreach不是在序言

7 ?- string_codes("acid", D). 
D = [97, 99, 105, 100]. 

8 ?- string_codes(S, [116, 101, 115, 116]). 
S = "test". 


15 ?- foreach(member(S, ["test", "acid"]), writeln(S)). 
test 
acid 
true. 

卻不能在一起:

14 ?- foreach(member(S, ["test", "acid"]), string_codes(S, X)). 
false. 

17 ?- foreach(member(X,[[116, 101, 115, 116], [97, 99, 105, 100]]), string_codes(S, X)). 
false. 

只有第一個字母印有驗證碼:

77 ?- foreach(member(X, [[97], [98],[99]]), (string_codes(S,X), writeln(S))). 
a 

在哪裏的問題,怎麼能解決呢?

編輯:MAPLIST工作只有一個辦法:

74 ?- maplist(string_codes, ["test","acid"], L). 
L = [[116, 101, 115, 116], [97, 99, 105, 100]]. 

73 ?- maplist(string_codes, L, [97, 98,99]). 
ERROR: string_codes/2: Type error: `list' expected, found `97' (an integer) 

其實,每個號碼應該是一個列表:

75 ?- maplist(string_codes, L, [[97], [98],[99]]). 
L = ["a", "b", "c"]. 

我如何轉換號碼列表到列表的列表?

我想:

tolistlist([H|T],[[H]|Outl]):- 
    writeln([[H]]), 
    tolistlist(T,Outl). 
tolistlist([],[]). 

它不會產生這種模式的數字列表,但仍然不能正常工作:

[[115],[116]] 
ERROR: string_codes/2: Type error: `character_code' expected, found `[116]' (a list) 
105 ?- 
+1

改爲使用'maplist/3'。 – mat

+1

'string_codes/2'在數字列表(字符代碼)上運行。所以,'maplist(string_codes,L,X)'預計'X'是字符代碼列表的列表。你能給出一個你想要轉換爲列表清單的例子嗎?如果你只想將'[97,98,99]'轉換爲'[[97],[98],[99]]',那麼很容易用'mapllist'完成:'code_as_list(C,[C ]),maplist(code_as_list,Lin,Lout)''。 – lurker

+0

它正在生產[[116,101,115,116]]而不是[[116],[101],[115],[116]]。我的原始列表是[[1,2,3],[4,5,6] ...]。我正在嘗試上面的功能。 – rnso

回答

3

foreach/2documentation描述實際上做的工作:

真,如果結果的結合是如此。不像forall/2,它運行一個 故障驅動的循環,證明目標發電機的各溶液, foreach/2創建一個結合使用。會合的每個成員是目標,在那裏與發電機它共享變量與從相應的溶液的值填充 的 副本。

這意味着

foreach(member(S, ["abc", "test"]), string_codes(S, X)) 

相當於結合:

string_codes("abc", X), string_codes("test", X) 

顯然,這是假,因爲X不能同時爲用於​​和"test"字符串代碼列表。您可以在這裏使用forall/2forall(member(S, ["abc", "test"]), string_codes(S, X))成功,但不會顯示X。你可以寫爲:

forall(member(S, ["abc", "test"]), (string_codes(S, X), writeln(X))). 

但隨後的X顯示只是一個副作用,而不是捕捉。

這給你留下maplist/3爲@mat建議:

?- maplist(string_codes, ["abc", "def"], ListOfCodeLists) 
ListOfCodeLists = [[97, 98, 99], [100, 101, 102]]. 

這確實在反向工作:

?- maplist(string_codes, ListOfStrings, [[97, 98, 99], [100, 101, 102]]). 
ListOfStrings = ["abc", "def"]. 

這裏,string_codes的代碼作爲其第二個參數的每個列表操作:string_codes(X, [97, 98, 99])產生​​和string_codes(X, [100, 101, 102])產生"def"

+1

不!文檔**不**說失敗驅動循環是相同的!事實上,它表示:*使用forall/2 ..優於傳統的故障驅動迴路... 此外,副作用的意外故障導致構造失敗。失敗使得很明顯,代碼存在問題,而失敗驅動的循環會成功並出現錯誤結果。* – false

+1

@false感謝您的支持。我今天晚些時候在電腦時會糾正我的答案。 – lurker