【问题标题】:prolog predicate [sublist(Xs, Ys)]序言谓词 [sublist(Xs, Ys)]
【发布时间】:2017-02-16 13:18:29
【问题描述】:

我是 prolog 的新手。这是我们工作室的问题,我不知道从哪里开始。 非常感谢您对此提供任何帮助。

子列表(Xs, Ys)

当 Xs 是一个包含 Ys 的一些元素的列表时,这成立,它们以相同的顺序出现在列表 Ys 中。只要 Ys 是正确的列表,这应该可以工作。例如:

sublist([a,c,e],[a,b,c,d,e]) 应该会成功。

sublist([a,e,c],[a,b,c,d,e]) 应该失败。

sublist([a,X,d],[a,b,c,d,e]) 应该有两个解 X=b 和 X=c。

sublist(X,[a,b,c])应该有X=[]; X=[c]; X=[b];X=[b,c]; X=[a]; X=[a,c]; X=[a,b];X=[a,b,c]这八个解。

【问题讨论】:

标签: list prolog append


【解决方案1】:

我的实现:

sublist([], []).
sublist([H| Rest1], [H| Rest2]) :-sublist(Rest1, Rest2).
sublist(H, [_ | Rest2]) :-sublist(H, Rest2).

例子:

?- sublist(X,[a,b,c]).
X = [a, b, c] ;
X = [a, b] ;
X = [a, c] ;
X = [a] ;
X = [b, c] ;
X = [b] ;
X = [c] ;
X = [].

?- sublist([a,c,e],[a,b,c,d,e]) .
true ;
false.

?- sublist([a,e,c],[a,b,c,d,e]) .
false.

?- sublist([a,X,d],[a,b,c,d,e]).
X = b ;
X = c ;
false.

【讨论】:

    【解决方案2】:

    请注意,子列表需要其元素在原始列表中是连续的。

    有了这个定义,通过定义辅助谓词前缀和后缀来定义子列表会更容易,示例取自Shapiro's book

    prefix([], _).
    prefix([X|Xs], [X,Ys]) :-
        prefix(Xs, Ys).
    
    suffix(Xs, Xs).
    suffix(Xs, [_|Ys]) :-
        suffix(Xs, Ys).
    

    – 然后只需将子列表定义为前缀的后缀即可:

    sublist(Xs, Ys) :-
        prefix(Ps, Ys),
        suffix(Xs, Ps).
    

    结果:

    ?- sublist(X, [1,2,3]).
    X = [] ;
    X = [1] ;
    X = [] ;
    X = [1, 2] ;
    X = [2] ;
    X = [] ;
    X = [1, 2, 3] ;
    X = [2, 3] ;
    X = [3] ;
    X = [] ;
    false.
    

    ——或作为后缀的前缀:

    sublist(Xs, Ys) :-
        prefix(Xs, Ss),
        suffix(Ss, Ys).
    

    结果:

    ?- sublist(X, [1,2,3]).
    X = [] ;
    X = [] ;
    X = [] ;
    X = [] ;
    X = [1] ;
    X = [2] ;
    X = [3] ;
    X = [1, 2] ;
    X = [2, 3] ;
    X = [1, 2, 3] ;
    

    但也可以进行递归定义:

    sublist(Xs, Ys) :-
        prefix(Xs, Ys).
    sublist(Xs, [_|Ys]) :-
        sublist(Xs, Ys).
    

    结果:

    ?- sublist(X, [1,2,3]).
    X = [] ;
    X = [1] ;
    X = [1, 2] ;
    X = [1, 2, 3] ;
    X = [] ;
    X = [2] ;
    X = [2, 3] ;
    X = [] ;
    X = [3] ;
    X = [] ;
    false.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多