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). |
- 您是否尝试运行它?你看见什么了?
-
另外,答案怎么可能是" 3"?三个香蕉的?
因此,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. |
- 观察它的第四种方法是1和2的变体。第二个参数本身具有所需的所有信息。这使mystery/3成为从列表中选择元素的一种简单方法。尝试询问?- mystery(X, [a, b, c, d], L).