3

在 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),

我得到了这个错误(因为此时变量没有值)未捕获的异常:error(type_error(evaluable,_#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),...])。但是代码从未达到这一点,因为当我尝试找到最大值时它会引发错误。

4

1 回答 1

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).

也可以,没有 foldl。

于 2013-05-25T14:16:45.783 回答