如何在prolog的CYK表上生产产品?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在prolog的CYK表上生产产品?相关的知识,希望对你有一定的参考价值。

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

?- product_c(["A","B"],["C","D"],What).
What = ["AC", "AD", "BC", "BD"].
?- product_c(["A"],[],What).
What = [].

我尝试过使用string_concat,但这给我的结果如下:

What = ["A", "B", "C", "D"].

我不确定如何解决这个问题。任何帮助深表感谢。

答案

你有这种类型混淆。最快的解决方法就是从这里获取笛卡儿产品Cartesian prod,然后连接结果列表。

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).

如果我们现在用您的案例进行测试,我们会得到:

?- product_c(["A","B"],["C","D"],What).
What = ["AC", "BC", "AD", "BD"] ;
false.

?- product_c(["A"],[],What). 
What = [] ;
false.
另一答案

所以你可以用这种方式解决这个问题:

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

?- list_pairs(List1, List2, Pairs).
List1 = ["A", "B"],
List2 = ["C", "D"],
Pairs = ["AC", "AD", "BC", "BD"]

以上是关于如何在prolog的CYK表上生产产品?的主要内容,如果未能解决你的问题,请参考以下文章

如何升级已在 Linux 上生产的 Solr 5 版本(作为服务安装)?

用于 WordPress 的 PHP 片段,用于获取所有产品子类别

线上生产环境部署Djngao+Nginx+Uwsgi

python 一个终端代码片段,在mac上生成可启动的usb live CD,以运行类似ubuntu或debian的内容。

一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!石杉的架构笔记

AIX 上生产环境中缓慢的动态 GSP 重新加载