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

如何在prolog中的CYK表上生成产品?,prolog,cyk,Prolog,Cyk,我们使用CYK表形成的概念在Prolog上生成这些结果。以下是产品c(+Cell1,+Cell2,-产品)的一些示例输出: 我尝试过使用string_concat,但结果如下: What = ["A", "B", "C", "D"]. 我不知道如何解决这个问题。非常感谢您的帮助。因此您可以通过以下方式解决此问题: list_pairs(List1, List2,String) :- List1 = ["A","B"], List2 = ["C","D"], findal

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

我尝试过使用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
可以得到这两个列表的所有组合(
对=[[A”,“C”,“D”,“B”,“C”,“B”,“D”])
)。为了将其转换为字符串列表,我编写了
pairToString/2

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

因此,您可以通过以下方式解决此问题:

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
可以得到这两个列表的所有组合(
对=[[A”,“C”,“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.

你把这里搞混了。最快的修复方法是从这里获取笛卡尔积,然后连接结果列表

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.

你能展示一下你写的代码吗?还有一些示例查询/预期结果?我就是这样做的:product_c(Cell1,Cell2,product):-append(Cell1,Cell2,product)。更正:我使用了append NOT string_concat。我得到的是[A”,“B”,“C”,“D”],而不是[AC”,“AD”,“BC”,“BD”]的预期结果。你能展示一下你写的代码吗?还有一些示例查询/预期结果?我就是这样做的:product_c(Cell1,Cell2,product):-append(Cell1,Cell2,product)。更正:我使用了append NOT string_concat。我得到的是[A”,“B”,“C”,“D”],而不是[AC”,“AD”,“BC”,“BD”]的预期结果。@重复Thx提到,我忘记了在Prolog中谓词以小写字母开头,变量以大写或下划线开头。它发生在结尾,因为我在测试时使用了不同的谓词名称,并试图更改它们以进行澄清。无论如何,请编辑上面的内容。@repeat Thx作为提示,我忘记了在Prolog中,谓词以小写字母开头,变量以大写或下划线开头。它发生在结尾,因为我在测试时使用了不同的谓词名称,并试图更改它们以进行澄清。无论如何,在上面编辑它。