作成した述語が正しく機能しません。述語は、データベース内のすべての事実の項目を数え、それらを「評価」する必要があります。(「評価」の意味については後述します)
たとえば、事実は次のとおりです。
:- dynamic listitem /1.
listitem(number).
listitem(letter).
listitem(word).
listitem(sentence).
私が作成した最初の述語は、すべての事実を 1 つのリストにまとめます。
members(W) :- bagof(X,listitem(X),W).
次に、リスト内のアイテムを数えたいと思います。そこで、カウント用の一般的な述語を作成しました。
count([],0).
count([_|L],N) :- count(L,N1), N is N1+1.
次の述語が正しく機能しません。この述語は、上記の事実のすべての項目をカウントする必要があります。
count_members(U) :- one_list([bagof(X,listitem(X),_W)],U).
問題は、他のアイテムを追加および削除できるように、データベースを動的にする必要があることです。これは、私が尋ねることができないことを意味します
?- count([number,letter,word,sentence],N)
事実が変わっているかもしれないので。
そして、最後の述語が間違っているため、まったく機能しない最後のステップは次のようになります。たとえば、データベース内の項目数が 4 の場合、prolog はクエリ "all_members(X)" に対して "X = four items" を返す必要があります。繰り返しますが、私が検索している述語は「all_members(X)」です。私が作成した他の述語は、実際の述語の作成に役立つはずです。
私の問題の解決策を見つけるお手伝いができれば、とてもうれしいです! (そうしないと今夜は眠れません…) ありがとうございます!!
編集:
すみません、one_list の定義を書き忘れました。私の考えは、たとえば次のようなリストを作成することでした:
[[number], [letter], [word]]
次のようなリストに:
[number, letter, word, list]
one_list(X,[X]) :- \+ is_list(X).
one_list([],[]).
one_list([X|Xs],Zs) :- one_list(X,Y), one_list(Xs,Ys), append(Y,Ys,Zs).