最大列表gnu prolog

时间:2013-05-25 12:48:32

标签: prolog meta-predicate

在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),...])。但代码永远不会达到这一点,因为当我试图找到最大值时会抛出错误。

1 个答案:

答案 0 :(得分:2)

您可以从库中获取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).

也可以,没有折叠。