我今天参加了Prolog的考试,并正在使用旧问题对其进行修改。
回答c是不正确的答案吗?有人可以向我解释一下吗?这将非常有帮助。谢谢,
考虑以下谓词:
swap([], []).
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S).
以下哪个查询和答案对不正确:
(a) ?- swap([a,b,c,d], S).
S = [b, a, d, c].
(b) ?- swap([a,b,d], H).
false.
(c) ?- swap([a,a,b,b], S).
S = [b, b, a, a].
(d) ?- swap([], S).
S = [].
答案 0 :(得分:0)
(c)确实是错误的答案。项目(c)具有以下查询:
swap([a,a,b,b], S).
如果您手动运行此查询,它显然与子句swap([], []).
不匹配它然后匹配第二个子句:swap([X1,X2|L], [X2,X1|S]) :-...
。
swap([a, a, b, b], S).
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S).
==> X1 = a, X2 = a, L = [b, b]
==> swap([a, a| [b,b]], [a, a | S]) :- swap([b, b], S).
Prolog可以使用给定列表[X1,X2|L]
实例化第一个参数[a,a,b,b]
。那就是X1 = a
,X2 = a
和列表的其余部分L = [b,b]
。根据此信息,您知道列表[X2,X1|S]
为[a,a|S]
,但(c)所示的答案为[b,b,a,a]
。您甚至不需要找出S
的内容,因为您知道al [a,a|S]
与[b,b,a,a]
不匹配。