当我的清单为空时,我的prolog程序不会停止

时间:2016-11-22 14:40:22

标签: list prolog

当我的输入列表为空时,我不知道为什么我的程序不会停止,尽管有一个事实可以处理这种情况。这是我的代码:

    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)]。

1 个答案:

答案 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).