Foreach不在Prolog工作

时间:2016-07-08 11:38:32

标签: prolog swi-prolog

我正在尝试使用以下代码,其中foreach和string_codes分别工作:

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

问题在哪里以及如何解决?

编辑:地图列表仅以一种方式运作:

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 个答案:

答案 0 :(得分:3)

foreach/2实际上按documentation

中所述的方式工作
  

如果结果的结合为真,则为真。与运行a的forall/2不同   故障驱动的循环证明了Generator的每个解决方案的目标,   foreach/2创建了一个连词。 结合的每个成员都是   目标的副本,其中与Generator共享的变量已填充   使用相应解决方案中的值。

这意味着

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

相当于连词:

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

显然,这是错误的,因为X不能同时是"abc""test"的字符串代码列表。你可以在这里使用forall/2forall(member(S, ["abc", "test"]), string_codes(S, X))成功,但不会显示X。你可以把它写成:

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

但是X的显示只是副作用而未被捕捉。

这会让你{@ 1}}为@mat建议:

maplist/3

反向运作:

?- 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])"abc"生成string_codes(X, [100, 101, 102])