首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将子列表等同于Prolog中CYK表的另一个子列表

将子列表等同于Prolog中CYK表的另一个子列表
EN

Stack Overflow用户
提问于 2018-03-02 05:05:35
回答 2查看 120关注 0票数 2

我目前正在开发一个Prolog程序,该程序将在给出一组产品后生成一个CYK解析表。但是,我在检查两行时遇到了问题,以确定它们是否等效。到目前为止,我的情况如下:

代码语言:javascript
复制
answer(X,X).

%Checks to see if it is equivalent

equal(X,Y) :- sort(X,X1), sort(Y,Y1), X1 == Y1.

%find the length of the lists

total_length([],0).
total_length([_|Xs],L) :- total_length(Xs,M), L is M+1.

%storing length of lists and possible use of a decrement here to decrement the length...but don't understand how 

storing(M,N) :- total_length(L,L_length), total_length(N,N_length), L_length is N_length, answer(L_length,N_length).

%Check for row equivalence...again, trying to find a way to decrement for the recursion, but unsure how to do it

sublist_check(Ra,Rb) :- storing(Ra,Rb), nth0(X,Ra,R1), nth0(Y,Rb,R2), equal(R1,R2), sublist_check(Ra,Rb).

假设输入是:

代码语言:javascript
复制
sublist_check([["A"],[],[]], [[],["A"],[]]). -->
false.

sublist_check([["A"],["B","C"],["B","C"]],[["A"],["C","B"],["C","B"]]). -->
true.

我认为我的问题是,我需要找到一种方法来创建一个与列表的最大长度相等的变量,并每次减少它,但是我遇到了将sublist_check的初始长度设置为它的原始数的错误。

任何输入/反馈都将是很棒的,非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-02 13:52:18

如果我已经正确地理解了您的问题,您需要检查两个列表在两个列表中的位置是否相同,是否具有相同的元素。你可以这样做:

代码语言:javascript
复制
check([],_).
check([H|T],L):-
    member(H,L),
    check(T,L).

sublist_check([],[]).
sublist_check([H1|T1],[H2|T2]):-
    check(H1,H2),
    sublist_check(T1,T2).

?- sublist_check([["A"],["B","C"],["B","C"]],[["A"],["C","B"],["C","B"]]).
true

?- sublist_check([["A"],[],[]], [[],["A"],[]]).
false
票数 1
EN

Stack Overflow用户

发布于 2018-03-03 13:57:02

这是damianodamiano回答(+1)的一个较短的编码。

代码语言:javascript
复制
check1(S,L) :- maplist(member_(L), S).
sublist_check1(A,B) :- maplist(check1, A,B).

member_(L,H) :- member(H,L).

使用图书馆(Yall)更有吸引力:

代码语言:javascript
复制
check2(S,L) :- maplist({L}/[H]>>member(H,L), S).
sublist_check2(A,B) :- maplist(check2, A,B).

图书馆(是的)它不是一个人..。之后

代码语言:javascript
复制
?- pack_install(lambda).

你可以的

代码语言:javascript
复制
:- use_module(library(lambda)).
check3(S,L) :- maplist(\H^member(H,L),S).
sublist_check3(A,B) :- maplist(check3, A,B).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49063131

复制
相关文章

相似问题

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