【问题标题】:prolog predicates - swap序言谓词 - 交换
【发布时间】:2014-04-04 18:47:01
【问题描述】:

我今天在 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 = [].

【问题讨论】:

  • C 不正确。仔细查看谓词并假装您是 prolog 解释器。然后将您的输入与 roght 子句匹配,看看会发生什么。

标签: prolog


【解决方案1】:

(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 可以用给定的列表[a,a,b,b] 实例化第一个参数[X1,X2|L]。那么,这意味着X1 = aX2 = a,以及列表的其余部分L = [b,b]。已经从这些信息中,您知道列表 [X2,X1|S][a,a|S],但 (c) 显示的答案是 [b,b,a,a]。你甚至不需要知道S 是什么,因为你已经知道[a,a|S] 不会匹配[b,b,a,a]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多