3

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(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 に答える