prolog之谜(c,[a,b,c,d],Z)

Prolog mystery(c,[a,b,c,d],Z)

我认为答案是3,但我不确定,任何人都可以提供帮助吗?

假设在Prolog中输入了以下两个语句:

1
2
mystery(X,[X|L],L).
mystery(X,[Y|L],[Y|M])  :-  mystery(X,L,M).

如果Prolog赋予其以下目标,Prolog将返回什么?

1
?- mystery(c,[a,b,c,d],Z).


因此,mystery/3定义为:

1
2
mystery(X, [X|L], L).
mystery(X, [Y|L], [Y|M]) :- mystery(X, L, M).

至少有三种查看mystery的方式:

  • 它接受元素X(第一个参数),在给定列表中查找它的存在(第二个参数),然后返回相同的列表,减去一次出现的X(第三个参数)。因此:

    1
    2
    3
    4
    5
    6
    7
    8
    ?- mystery(c, [a, b, c, d], Z).
    Z = [a, b, d] ;
    fail.

    ?- mystery(c, [a, b, c, d, c], Z).
    Z = [a, b, d, c] ;
    Z = [a, b, c, d] ;
    fail.

  • 查看mystery的另一种方式是,它检查构成第二个和第三个参数的列表是否仅在一个元素上有所不同,即第二个列表等于第三个列表,只是在第二个列表中有一个附加元素一个地方。因此:

    1
    2
    3
    4
    5
    6
    ?- mystery(X, [a, b, c, d], [a, b]).
    fail.

    ?- mystery(X, [a, b, c, d], [a, b, c]).
    X = d ;
    fail.

    请注意顺序很重要:

    1
    2
    ?- mystery(X, [a, b, c, d], [a, c, b]).
    fail.
  • 最后,mystery还可以生成将第一个参数散布在第三个参数列表中的所有方法。因此:

    1
    2
    3
    4
    5
    6
    ?- mystery(d, Y, [a, b, c]).
    Y = [d, a, b, c] ;
    Y = [a, d, b, c] ;
    Y = [a, b, d, c] ;
    Y = [a, b, c, d] ;
    fail.