首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用prolog在CYK表上生成产品?

如何用prolog在CYK表上生成产品?
EN

Stack Overflow用户
提问于 2018-03-01 21:18:16
回答 2查看 162关注 0票数 0

我们正在使用CYK表形成的概念在Prolog上产生这些结果。以下是product_c(+Cell1,+Cell2,-Product)的一些示例输出:

代码语言:javascript
复制
?- product_c(["A","B"],["C","D"],What).
What = ["AC", "AD", "BC", "BD"].
?- product_c(["A"],[],What).
What = [].

我尝试过使用string_concat,但得到的结果如下:

代码语言:javascript
复制
What = ["A", "B", "C", "D"].

我不知道如何解决这个问题。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 22:53:45

你弄错了类型。最快的解决方法是从这里取笛卡尔乘积Cartesian prod,然后连接结果列表。

代码语言:javascript
复制
list_List_CartProd(L1,L2,L3):- 
     cartProd(L1,L2,L3,L1).

cartProd(_, [], [], _).

cartProd([], [_|T2], L3, L4):-
    cartProd(L4, T2, L3, L4).

cartProd([H1|T1], [H2|T2], [[H1,H2]|T3], L4):-
    cartProd(T1, [H2|T2], T3, L4).

list_concatEl([],[]).
list_concatEl([X|Xs],[Y|Ys]) :-
    X=[X1,X2],
    string_concat(X1,X2,Y),
    list_concatEl(Xs,Ys).

product_c(L1,L2,L4) :-
    list_List_CartProd(L1,L2,L3),
    list_concatEl(L3,L4).

如果我们现在用你的案例测试它,我们会得到:

代码语言:javascript
复制
?- product_c(["A","B"],["C","D"],What).
What = ["AC", "BC", "AD", "BD"] ;
false.

?- product_c(["A"],[],What). 
What = [] ;
false.
票数 1
EN

Stack Overflow用户

发布于 2018-03-01 22:45:06

所以你可以这样解决这个问题:

代码语言:javascript
复制
list_pairs(List1, List2,String) :-
    List1 = ["A","B"],
    List2 = ["C","D"],
    findall([X,Y], (member(X, List1), member(Y, List2)), Pairs),
    pairToString(Pairs,String).

pairToString([],[]).
pairToString([[X,Y]|T],[H1|T1]):-
    atomic_list_concat([X,Y], '', Atom),
    atom_string(Atom, H1),
    pairToString(T,T1).

因此,使用findall/3可以获得两个列表(Pairs = [["A", "C"], ["A", "D"], ["B", "C"], ["B", "D"]])的所有组合。为了将其转换为字符串列表,我编写了pairToString/2

代码语言:javascript
复制
?- list_pairs(List1, List2, Pairs).
List1 = ["A", "B"],
List2 = ["C", "D"],
Pairs = ["AC", "AD", "BC", "BD"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49050563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档