首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:递归构建一个列表-无限解决方案

Prolog:递归构建一个列表-无限解决方案
EN

Stack Overflow用户
提问于 2014-11-03 04:26:37
回答 1查看 117关注 0票数 1

我对Prolog完全陌生,很难理解它的统一系统。我的问题如下:

我有一个约束整数,一个源数组和一个目标数组(它们都是整数数组)。我希望过滤Source数组中的元素,这样剩下的元素在Target数组中有一个对应的元素,因此Source数组中的元素和Target数组中的元素之间的区别完全是约束的。

示例: FilteredSource = 1,Source = 1,5,7,Target = 2,3,4。因为abs(1-2)= 1,abs(5-4)=1。

根据我使用的参数,我要么得到错误的结果,要么查询get处于无限循环中。

到目前为止,我想出了如下结论:

代码语言:javascript
复制
filterByDistanceConstraint(_Constraint, [], _Target, _).

filterByDistanceConstraint(Constraint, [SourceHead|SourceTail], Target, FilteredSource) :-
    filterByDistanceConstraint(Constraint, SourceTail, Target, NewFilteredSource),
    ( 
        passesDistanceConstraint(Constraint, SourceHead, Target)
    ->  
        append(NewFilteredSource, [SourceHead], FilteredSource),
        filterByDistanceConstraint(Constraint, SourceTail, Target, NewFilteredSource)
    ;   
        filterByDistanceConstraint(Constraint, SourceTail, Target, FilteredSource)
    ).

passesDistanceConstraint部分似乎工作正常,但我将在这里包含它,以供参考:

代码语言:javascript
复制
passesDistanceConstraint(_Constraint, _SourceHead, []) :-
    fail.
passesDistanceConstraint(Constraint, SourceHead, [TargetHead|TargetTail]) :-
    Distance is TargetHead - SourceHead,
    (   abs(Distance) =\= Constraint %test failed
    ->  passesDistanceConstraint(Constraint, SourceHead, TargetTail)
    ;   write('Distance constraint passed for '), write(SourceHead), nl
    ).

我很确定这是一个微不足道的问题,但我想不出,我正在脱发。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 06:34:20

这应该能行

代码语言:javascript
复制
filterByDistanceConstraint(_Constraint, [], _Target, []).

filterByDistanceConstraint(Constraint, [SourceHead|SourceTail], Target, FilteredSource) :-
    (   passesDistanceConstraint(Constraint, SourceHead, Target)
    ->  FilteredSource = [SourceHead|NewFilteredSource]
    ;   FilteredSource = NewFilteredSource
    ),
    filterByDistanceConstraint(Constraint, SourceTail, Target, NewFilteredSource).

注意第一个规则中的[]而不是_,第二个规则中只有一个递归调用。

“filter”编程模式是在SWI中通过包含/3或排除/3来实现的,但是要用普通的Prolog编写,因为成员/2可以充当‘枚举器’:

代码语言:javascript
复制
filterByDistanceConstraint(Constraint, Source, Target, FilteredSource) :-
  findall(E, (member(E, Source), member(C, Target), abs(E - C) =:= Constraint), FilteredSource).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26707776

复制
相关文章

相似问题

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