我对Prolog完全陌生,很难理解它的统一系统。我的问题如下:
我有一个约束整数,一个源数组和一个目标数组(它们都是整数数组)。我希望过滤Source数组中的元素,这样剩下的元素在Target数组中有一个对应的元素,因此Source数组中的元素和Target数组中的元素之间的区别完全是约束的。
示例: FilteredSource = 1,Source = 1,5,7,Target = 2,3,4。因为abs(1-2)= 1,abs(5-4)=1。
根据我使用的参数,我要么得到错误的结果,要么查询get处于无限循环中。
到目前为止,我想出了如下结论:
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部分似乎工作正常,但我将在这里包含它,以供参考:
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
).我很确定这是一个微不足道的问题,但我想不出,我正在脱发。谢谢你的帮助!
发布于 2014-11-03 06:34:20
这应该能行
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可以充当‘枚举器’:
filterByDistanceConstraint(Constraint, Source, Target, FilteredSource) :-
findall(E, (member(E, Source), member(C, Target), abs(E - C) =:= Constraint), FilteredSource).https://stackoverflow.com/questions/26707776
复制相似问题