1

こんにちは、整数のリストを入力として取り、可能であれば、合計が元のリストのすべての整数の合計値のちょうど半分になる 2 つのサブリストを返す perfect_part という関数を書きたいと思います。例えば、

?- perfect_part([6, 3, 2, 1], L, R).
L = [6],
R = [3, 2, 1] ;
false.

?- perfect_part([1, 2, 3, 4, 0], L, R).
L = [1, 4],
R = [2, 3, 0] ;
L = [2, 3],
R = [1, 4, 0] ; 

これが私の試みです:

listsum([], 0).
listsum([H|T], Total):-
    listsum(T, Sum1),
    Total is H + Sum1.

    subset([],L).
    subset([X|T],L):- member(X,L),subset(T,L).

perfect_part([], 0, 0).
perfect_part(Nums, Left, Right):-
    listsum(Nums, S),
    H is S / 2,
    subset(Left, Nums),
    subset(Right, Nums),
    listsum(Left, H),
    listsum(Right, H).

しかし、実行すると、エラーメッセージが表示されました:

エラー: is/2: 引数が十分にインスタンス化されていません

どうすれば修正できますか?私はこの問題を解決するための正しい道を進んでいますか?

4

1 に答える 1

1

述語サブセット/2 が欠落しており、質問に答えるために不可欠な部分です。具体的には、サブリストが連続している場合、次のように簡単に解決できます

perfect_part(X,L,R) :- append(L,R,X), listsum(L,S), listsum(R,S).

次に、次のように、append/3 のより適切な代替を探します。

partition([],[],[]).
partition([H|T],[H|L],R) :- partition(T,L,R).
partition([H|T],L,[H|R]) :- partition(T,L,R).

それはにつながる

perfect_part(X,L,R) :- partition(X,L,R), listsum(L,S), listsum(R,S).

edit今、subset/2 から、エラーの原因は明らかです: 基本ケースでは、L はバインドされていません。

である必要がありますがsubset([],[]).、終了しません。どのようにエラーを取得するのだろうか...

もっと編集ソリューションの重複を避けるために、対称性を破ることをお勧めします

perfect_part(X,L,R) :- partition(X,L,R), L @=< R, listsum(L,S), listsum(R,S).
于 2014-03-20T08:21:46.857 に答える