2

我认为答案是 3,但我不确定,谁能提供一些帮助?

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

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

如果给它以下目标,Prolog 会返回什么?

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

1 回答 1

6

所以,mystery/3定义为:

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

有(至少)三种查看方式mystery

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

    ?- 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.
    
  2. 另一种看待的方式mystery是它检查构成其第二个和第三个参数的列表是否仅在一个元素方面有所不同,即第二个列表等于第三个列表,除了它在一个位置有一个附加元素。因此:

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

    请注意,顺序很重要:

    ?- mystery(X, [a, b, c, d], [a, c, b]).
    fail.
    
  3. 最后,mystery还可以生成第一个参数可以穿插在第三个参数列表中的所有方式。因此:

    ?- 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.
    
于 2009-11-12T09:19:15.257 回答