1

問題があります。例のように数値要素を含むリストがあります。すべてのペアを見つけて数えたいのですが。(すべての要素は、1つのペアの一部にしかなれません)

?- num_pairs([4,1,1,1,4],N).
N=1;

誰かが私がこの問題を解決するのを手伝ってくれる?

4

1 に答える 1

2

それを機能させるには、いくつかのことが必要です。

  • リスト内で項目が繰り返される回数をカウントする機能
  • リストから値に一致するすべての要素を削除する機能
  • 条件付きで数値をインクリメントする機能

カウントする方法は次のとおりです。

count([], _, 0).
count([H|T], H, R) :- count(T, H, RT), R is RT + 1.
count([H|T], X, R) :- H \= X, count(T, X, R).

delete/3削除は SWI の述語で行うことができます。これは構築された述語です。

1 つを条件付きで追加するには、2 つのルールが必要です。1 つはカウントが 1 に等しい場合、もう 1 つはカウントが 1 に等しくない場合です。

add_if_count_is_one(H, T, RT, R) :- count(T, H, 1), R is RT + 1.
add_if_count_is_one(H, T, R, R) :- count(T, H, X), X \= 1.

最後に、ペアのカウントは次のようになります。

num_pairs([], 0).
num_pairs([H|T], R) :- delete(T, H, TT),
                       num_pairs(TT, RT),
                       add_if_count_is_one(H, T, RT, R).

空のリストにはペアがありません。アイテムがペアの一部としてカウントされると、そのコピーはリストの残りから削除されます。

ideone で実行中のプログラムは次のとおりです。

于 2012-12-13T21:23:09.993 に答える