max list gnu prolog

В прологе GNU с ограничениями: у меня есть список, который для 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 (Assessment, _ # 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), ...]). Но код никогда не достигает этой точки, так как выдает ошибку, когда я пытаюсь найти максимальное значение.


person gsamaras    schedule 25.05.2013    source источник


Ответы (1)


Вы можете получить определение foldl / 4 из swi -prolog библиотеки. Попробовать - на консоли 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).

работает без складок.

person CapelliC    schedule 25.05.2013