我认为答案是3但我不确定,有人可以提供一些帮助吗?
假设在Prolog中输入以下两个语句:
mystery(X,[X|L],L).
mystery(X,[Y|L],[Y|M]) :- mystery(X,L,M).
Run Code Online (Sandbox Code Playgroud)
如果有人给出以下目标,Prolog将返回什么?
?- mystery(c,[a,b,c,d],Z).
Run Code Online (Sandbox Code Playgroud)
所以,mystery/3
定义为:
mystery(X, [X|L], L).
mystery(X, [Y|L], [Y|M]) :- mystery(X, L, M).
Run Code Online (Sandbox Code Playgroud)
有(至少)三种方式可以看mystery
:
它需要一个元素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.
Run Code Online (Sandbox Code Playgroud)另一种方法mystery
是检查构成其第二个和第三个参数的列表是否仅相对于一个元素不同,即第二个列表等于第三个列表,除了它在一个地方有一个附加元素.从而:
?- mystery(X, [a, b, c, d], [a, b]).
fail.
?- mystery(X, [a, b, c, d], [a, b, c]).
X = d ;
fail.
Run Code Online (Sandbox Code Playgroud)
请注意,订单很重要:
?- mystery(X, [a, b, c, d], [a, c, b]).
fail.
Run Code Online (Sandbox Code Playgroud)最后,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.
Run Code Online (Sandbox Code Playgroud)