prolog谓词 - 交换

时间:2014-04-04 08:52:05

标签: prolog

我今天参加了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 = [].

1 个答案:

答案 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 = aX2 = a和列表的其余部分L = [b,b]。根据此信息,您知道列表[X2,X1|S][a,a|S],但(c)所示的答案为[b,b,a,a]。您甚至不需要找出S的内容,因为您知道al [a,a|S][b,b,a,a]不匹配。