当输入列表为空时,我不明白为什么我的程序不停止,即使有一个事实可以处理这种情况。这是我的密码:
build_vps([], []).
build_vps([X | Ys], Zs):-
atom_number(X, C),
number(C),
build_vps(Ys, Zs).
build_vps([X, Y, Z | Ys], Zs):-
Y = '^',
atom_number(Z, C),
number(C),
build_vps(Ys, [v(C, X) | Zs]).
build_vps([X, Y, Z | Ys], [v(1, X)| Zs]):-
Y \= '^',
build_vps([Y, Z | Ys], Zs).我有一个像x,^,'3这样的字符列表,我应该把这些字符放到像v(3,x)这样的结构中,我称之为build_vps(x,y,^,'3',R)。我试图实现的是R= v(1,x),v(3,y)。
发布于 2016-11-22 16:55:38
它确实停止了。它简单地说False,因为它不能匹配您的任何规则。
是的,我知道,但我不明白为什么。如果您跟踪它,当它到达第一个列表中的0元素时,您会看到它一直在运行。
不是,你看到的是呼吁
build_vps(Ys, [v(C, X) | Zs]).现在,您没有为这个程序提供足够的信息,但我猜一旦您拥有了[y, ^, '3'],您希望它与第三条规则相匹配。
如果是这样的话,程序失败的原因是它无法匹配以下内容:build_vps(Ys, [v(C, X) | Zs]).
您可以通过尝试来确认这一点:build_vps([], [v(3, y) | Zs]).
通过将第三条规则重写为以下内容,可以很容易地解决这一问题:
build_vps([], []).
build_vps([X | Ys], Zs):-
atom_number(X, C),
number(C),
build_vps(Ys, Zs).
/*
* This rule has been modified
*/
build_vps([X, Y, Z | Ys], [v(C, X) | Zs]):-
Y = '^',
atom_number(Z, C),
number(C),
build_vps(Ys, Zs).
build_vps([X, Y, Z | Ys], [v(1, X)| Zs]):-
Y \= '^',
build_vps([Y, Z | Ys], Zs).https://stackoverflow.com/questions/40744734
复制相似问题