Prolog字符串列表产品,无法弄清楚递归

时间:2018-03-11 23:01:27

标签: string prolog swi-prolog cartesian-product

一件产品/ 3件 one_product(+非终结,+细胞, - 产品)

这是我得到的最接近的但是我不能让字符串与尾部相乘。我已经研究了整整一个星期。

conca(String,[H|T],Product) :-
    string_concat(String,H,Combined),
    append([Combined],T,Product).
one_product(String,Cell,Product) :-
    conca(String,Cell,Product).

我得到了

?- one_product("A",["B","C"],What). 
What = ["AB", "C"].

另一种尝试的一部分。

Product = String * H.

这些是单例尝试。

conca([],[_],Product) :-
    Product = [].
conca(String,[],Product) :-
    Product = [].

这些是例子

?- one_product([],["B"],What).
What = [].
?- one_product("A",["B"],What).
What = ["AB"].
?- one_product("A",["B","C"],What).
What = ["AB", "AC"].
?- one_product("A",[],What).
What = [].

您还会注意到一个空单元格的产品是空的。

1 个答案:

答案 0 :(得分:0)

您不希望将append/3用于此类内容。您需要一个递归列表过程:

one_product(_, [], []).
one_product(String, [H|T], [StringH|StringT]) :-
    string_concat(String, H, StringH),
    one_product(String, T, StringT).

这是Prolog中的常见模式,可以使用maplist/3

完成
one_product(String, StringList, Product) :-
    maplist(string_concat(String), StringList, Product).

这会将字符串String与列表StringList的每个字符串元素连接(前置),从而生成列表Product

现在,上面唯一的问题是你的情况:

one_product([],["B"],What).

这种情况使用第一个参数的列表而不是字符串。这是意图吗?如果是这样,您可以单独处理:

one_product([], _, []).
one_product(String, StringList, Product) :-
    string(String),
    maplist(string_concat(String), StringList, Product).