当我的输入列表为空时,我不知道为什么我的程序不会停止,尽管有一个事实可以处理这种情况。这是我的代码:
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)]。
答案 0 :(得分:0)
确实停止了。它只是说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).