【问题标题】:Get "real" prefixes/suffixes/infixes in Prolog在 Prolog 中获取“真正的”前缀/后缀/中缀
【发布时间】:2017-02-22 07:07:53
【问题描述】:

前缀/后缀的 Prolog 表示法非常简单: 它几乎把所有的工作都放在了追加上。 对于那些不知道的人:

prefix(P,L):-append(P,_,L).
suffix(S,L):-append(_,S,L).

现在这意味着,prefix(X,[a,b,c,d]). 的结果 将是:X=[];X=[a];X=[a,b];X=[a,b,c];X=[a,b,c,d]

这是我的问题:我想要一个“真正的”前缀。因此,前缀不能为空,其后面的部分也不能为空。 所以查询prefix(X,[a,b,c,d]).的结果应该是

X=[a];X=[a,b];X=[a,b,c]

就是这样。

不幸的是,标准内置前缀谓词的真正优势在于,它可以使用 append 的终止,即append([],Y,Y). 所以很容易知道什么时候停止,一个一个地挑选列表直到列表为空。

我的终止意味着:如果列表中只剩下一个元素,则停止。 我该怎么做?

我的天真结果是:

prefix(P,L):-
length(P,1),append(P,E,L),E/=[].

这感觉不对。我在工作,所以我没有检查这是否真的有效,但它应该:

有没有更方便的方法来做到这一点? 后缀也是如此,这会更难,因为你没有办法像头一样具体地处理尾巴,我想我只是把整个事情颠倒过来,然后在上面调用前缀。

中缀只是两个的组合。

我希望我的意思很清楚。感谢您的输入! tl;dr: 如何写一个谓词 prefix/2 只过滤真实前缀,所以前缀本身不能为空,后面的列表也不能为空。

【问题讨论】:

    标签: list recursion prolog append prefix


    【解决方案1】:

    对于真正的前缀,你可以尝试这样做:

    list_prefix(List, [H|T]) :-
        append([H|T], [_|_], List).
    

    这只是说第一个参数必须至少有一个元素,而列表的其余部分必须至少有一个元素。

    并遵循@false 的建议使其更加明确:

    list_real_prefix(List, Prefix) :-
        Prefix = [_|_],
        Rest = [_|_],
        append(Prefix, Rest, List).
    

    “真实”后缀将完全相同:

    list_real_suffix(List, Suffix) :-
        Front = [_|_],
        Suffix = [_|_],
        append(Front, Suffix, List).
    

    【讨论】:

    • 感谢您的回复。我几乎睁不开眼睛,我会尽快回复。我需要休息片刻——只是为了确保你不会感到被遗忘:)
    【解决方案2】:

    您也可以为此使用 DCG,这是描述性的:

    list_prefix(P) --> non_empty_seq(P), non_empty_seq(_).
    non_empty_seq([X]) --> [X].
    non_empty_seq([X|Xs]) --> [X], non_empty_seq(Xs).
    
    | ?- phrase(list_pref(P), [a,b,c,d]).
    
    P = [a] ? a
    
    P = [a,b]
    
    P = [a,b,c]
    
    no
    | ?-
    

    你可以类似地定义后缀:

    list_suffix(S) --> non_empty_seq(_), non_empty_seq(S).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多