如何在prolog的CYKtable上生产产品?
How to produce products on the CYK table in prolog?
我们使用 CYK table 形成的概念在 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"].
我不确定如何解决这个问题。非常感谢任何帮助。
所以你可以这样解决这个问题:
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"]
你在这里有点搞混了。最快的解决方法就像从此处 获取笛卡尔积,然后连接结果列表。
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.
我们使用 CYK table 形成的概念在 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"].
我不确定如何解决这个问题。非常感谢任何帮助。
所以你可以这样解决这个问题:
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"]
你在这里有点搞混了。最快的解决方法就像从此处
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.