【问题标题】:Equating a Sublist to Another Sublist for CYK table in Prolog将子列表等同于 Prolog 中 CYK 表的另一个子列表
【发布时间】:2026-02-22 18:25:01
【问题描述】:

我目前正在开发一个 Prolog 程序,该程序将在获得一组产品后生成一个 CYK 解析表。但是,我在检查两行以查看它们是否相等时遇到了麻烦。到目前为止,这是我所拥有的:

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

假设输入是:

sublist_check([["A"],[],[]], [[],["A"],[]]). -->
false.

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

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

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

【问题讨论】:

  • // 不在 SWI 中开始评论 ...
  • 很抱歉,但我认为您完全错了。 Prolog 是关于 relational 编程的,试着改变你的心态。而 CYK 是学习 Prolog 的绝佳方式……太悲伤了……
  • 这个equal(X,Y) :- sort(X,Y). 是对equal(X,Y) :- sort(X,X1), sort(Y,Y1), X1 == Y1. 的改进?或者您真的需要检查变量状态?

标签: prolog cyk


【解决方案1】:

这是 damianodamiano 答案 (+1) 的较短编码

check1(S,L) :- maplist(member_(L), S).
sublist_check1(A,B) :- maplist(check1, A,B).

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

使用库(yall),更吸引人:

check2(S,L) :- maplist({L}/[H]>>member(H,L), S).
sublist_check2(A,B) :- maplist(check2, A,B).

图书馆(yall)它并不孤单...... 之后

?- pack_install(lambda).

你可以

:- use_module(library(lambda)).
check3(S,L) :- maplist(\H^member(H,L),S).
sublist_check3(A,B) :- maplist(check3, A,B).

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      最近更新 更多