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

时间:2009-11-12 09:07:16

标签: prolog

我认为答案是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).

1 个答案:

答案 0 :(得分:6)

因此,mystery/3定义为:

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

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

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

    X
  2. 查看?- 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

    请注意,订单很重要:

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

    mystery