【发布时间】:2015-03-08 23:31:26
【问题描述】:
问题说明:在 Prolog 中定义一个关系,equal_a_b(L),如果 L 包含相等数量的 a 和 b 条款。
我编写了代码来计算 a 项和 b 项的数量,并检查 a==b。如果 a===b 为假,那么程序应该输出 no。但是,当我测试我的代码时,它输出是,我不知道为什么。
代码如下:
equal_a_b(L):-
eqab(L, A, B),
eqabn(A, B).
eqab([], 0, 0).
eqab([a|L], X, Y):- eqab(L, Z, A), X is Z + 1, Y is A + 0.
eqab([b|L], X, Y):- eqab(L, Z, A), X is Z + 0, Y is A + 1.
eqab([C|L], X, Y):- eqab(L, Z, A), X is Z + 0, Y is A + 0.
eqabn(A, B):- A==B.
这里是跟踪程序,例如 (equal_a_b([a]). 应该输出 no:
| ?- trace, equal_a_b([a]).
The debugger will first creep -- showing everything (trace)
1 1 Call: equal_a_b([a]) ?
2 2 Call: eqab([a],_85,_86) ?
3 3 Call: eqab([],_110,_111) ?
3 3 Exit: eqab([],0,0) ?
4 3 Call: _138 is 0+1 ?
4 3 Exit: 1 is 0+1 ?
5 3 Call: _166 is 0+0 ?
5 3 Exit: 0 is 0+0 ?
2 2 Exit: eqab([a],1,0) ?
6 2 Call: eqabn(1,0) ?
7 3 Call: 1==0 ?
7 3 Fail: 1==0 ?
6 2 Fail: eqabn(1,0) ?
2 2 Redo: eqab([a],1,0) ? n
(10 ms) yes
感谢您的帮助。
【问题讨论】:
-
[a]将匹配[C|L]以及[a|L]。您需要确保在最后一个子句中使用C \= a和C \= b。否则,它将导致eqab([a], 0, 0)为真。 -
为简洁起见,您可以使用
eqab([a|L], X, A) :- eqab(L, Z, A), X is Z + 1.而不是eqab([a|L], X, Y):- eqab(L, Z, A), X is Z + 1, Y is A + 0.。同样适用于您的eqab([b|L],...)子句。
标签: prolog