在GNU prolog中,有约束:
我有一个列表,对于N = 5(例如),它是这样的:
[3*(1-_#0(0..1)),2*(1-_#18(0..1)),1*(1-_#36(0..1)),4*(1-_#54(0..1)),2*(1-_#72(0..1))]
我正在研究有限域约束环境,我试过这个 max_list(MaxFilter,M0),
我收到了这个错误(因为变量没有这个值 时刻) 未捕获的异常:错误(type_error(可评估,_#4195373(0..1)),(=<)/ 2)
在Eclipse中,我会使用eval,在SWI中,我使用了这个谓词
lmax([H|T], X):-
foldl(max_, T, H, Exp),
X #= Exp.
max_(E, X, max(E, X)).
但我没有在GNU中发现任何等价的foldl。
我该怎么办?有任何想法吗?我被困住了,我一直在寻找 整天互联网......
我真正想要的是在解决方案列表的标签出现时(在我的主谓词的最后)找到此列表的最大值。当发生这种情况时,我试图找到最大值的列表变量将有一个值(它们是相同的变量,对于上面的例子,我有Sol = [_#0(0..1),_# 18(0..1),...])。但代码永远不会达到这一点,因为当我试图找到最大值时会抛出错误。
答案 0 :(得分:2)
您可以从swi-prolog库中获取foldl / 4的定义。试用 - 在SWI控制台 - 进入
?- edit(foldl/4).
然后你可以研究/复制我在这里粘贴的定义
foldl(Goal, List, V0, V) :-
foldl_(List, Goal, V0, V).
foldl_([], _, V, V).
foldl_([H|T], Goal, V0, V) :-
call(Goal, H, V0, V1),
foldl_(T, Goal, V1, V).
然后我尝试使用gprolog,它正在工作:
| ?- consult('prolog/foldl').
compiling /home/carlo/prolog/foldl.pl for byte code...
/home/carlo/prolog/foldl.pl compiled, 12 lines read - 1464 bytes written, 22 ms
yes
| ?- lmax([1,4,2],X).
X = 4
yes
当然,较不通用的版本更容易上班
lmax([A,B|T], X):-
X #= max(A, Exp),
lmax([B|T], Exp).
lmax([X], X).
也可以,没有折叠。