首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Prolog构建具有递归的列表

用Prolog构建具有递归的列表
EN

Stack Overflow用户
提问于 2016-11-11 03:01:07
回答 1查看 328关注 0票数 0

我有一个递归谓词,它构建了一个适合它的列表,问题是它最终会开始‘去构建它’并给我一个空列表,linha谓词是ok的,它给VelOr一个值。

代码语言:javascript
复制
actualizarveiculos(_,[],D).

actualizarveiculos(Tempo,[(X,Y)|RestoVeiculos],NovaVeiculos):-
    linha(Y,Or,Vel),
    faz_andar_veic(Or,(X,Y),C,mod(Tempo,Vel)),
    append(NovaVeiculos,[C],D),
    actualizarveiculos(Tempo,RestoVeiculos,D).

faz_andar_veic(90,(X,Y),(X+1,Y),0).

faz_andar_veic(270,(X,Y),(X-1,Y),0).

faz_andar_veic(_,(X,Y),(X,Y),C):-
  C=\=0.

痕迹

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-11 14:44:38

您需要将其更改如下:

代码语言:javascript
复制
actualizarveiculos(_,[],D, D).

actualizarveiculos(Tempo,[(X,Y)|RestoVeiculos],Acc, Res):-
    Or is 2,
    Vel is 2,
    faz_andar_veic(Or,(X,Y),C,mod(Tempo,Vel)),
    append(Acc,[C],D),
    actualizarveiculos(Tempo,RestoVeiculos,D, Res).

faz_andar_veic(90,(X,Y),(X+1,Y),0).

faz_andar_veic(270,(X,Y),(X-1,Y),0).

faz_andar_veic(_,(X,Y),(X,Y),C):-
    C=\=0.

测试运行:

代码语言:javascript
复制
[debug]  ?- actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], [], Res).
Res = [ (-5, 3), (-4, 4), (-4, 5)] .

在您提供的跟踪中,由于N是未绑定的,所以您可以查询actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N).,然后NovaVeiculos变成解绑定,然后是:append(NovaVeiculos,[C],D),,它可能没有执行您认为它所做的事情,或者至少没有完成您想要做的事情。它所做的是尝试将一个未绑定变量附加到一个列表中,结果与另一个未绑定变量相统一,该变量显然可以给出无限多的解,例如:

代码语言:javascript
复制
[debug]  ?- actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N).
N = [] ;
N = [_G3430] ;
N = [_G3430, _G3436] ;
N = [_G3430, _G3436, _G3442] ;
N = [_G3430, _G3436, _G3442, _G3448] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472, _G3478] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472, _G3478|...] ;

希望它有帮助,如果你有问题,评论。由于您没有提供linha/3谓词,所以我只是用两个统一来交换它:

代码语言:javascript
复制
Or is 2,
Vel is 2,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40540474

复制
相关文章

相似问题

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