2016-11-22 41 views
0

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

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

你能告诉你如何从顶层调用它吗?也许你想要达成什么解释? – 2016-11-22 14:50:31

+1

当您在第一个参数中使用列表编写递归谓词时,请尝试尽可能使用两个子句:'foo([] ...)。'和'foo([H | T],.. 。): - ...,foo(T,...)。 – 2016-11-22 14:57:50

+1

你应该编辑你的答案,并精确地显示**你如何加载文件,你如何做查询,以及发生了什么。现在,对我来说,运行'? - build_vps([x,y,^,3],R).'(我不得不在'^'后加一个逗号)给我'ERROR:atom_number/2:Type error: '原子'预期,找到'3'(一个整数)'。所以我不能用你给我的东西来重现你的错误。 – 2016-11-22 15:25:33

回答

0

它停止。它只是说False,因为它不符合你的任何规则。

Yes, I know that but I don't get why. If u trace it, you'll see it keeps going when it reaches 0 elements in the first list.

它不,你看到的是调用

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). 
+0

谢谢,这真是我的愚蠢。它现在有效,不得不添加一条新规则,因为当我在列表中只有2个元素时,程序不起作用。谢谢!! –

相关问题