首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当列表为空时,我的prolog程序不会停止

问当列表为空时,我的prolog程序不会停止
EN

Stack Overflow用户
提问于 2016-11-22 14:40:22
回答 1查看 300关注 0票数 0

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

代码语言:javascript
复制
    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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-22 16:55:38

它确实停止了。它简单地说False,因为它不能匹配您的任何规则。

是的,我知道,但我不明白为什么。如果您跟踪它,当它到达第一个列表中的0元素时,您会看到它一直在运行。

不是,你看到的是呼吁

代码语言:javascript
复制
build_vps(Ys, [v(C,  X) | Zs]).

现在,您没有为这个程序提供足够的信息,但我猜一旦您拥有了[y, ^, '3'],您希望它与第三条规则相匹配。

如果是这样的话,程序失败的原因是它无法匹配以下内容:build_vps(Ys, [v(C, X) | Zs]).

您可以通过尝试来确认这一点:build_vps([], [v(3, y) | Zs]).

通过将第三条规则重写为以下内容,可以很容易地解决这一问题:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40744734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档