0

作成した述語が正しく機能しません。述語は、データベース内のすべての事実の項目を数え、それらを「評価」する必要があります。(「評価」の意味については後述します)

たとえば、事実は次のとおりです。

:- 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).
4

1 に答える 1

1

あなたの質問にはいくつかの混乱があるようです。

データベースの数をカウントするには (が として宣言されている限り、現在データベースにfacts/1存在しない場合でも期待どおりに機能します):factsfactsdynamic

?- findall(X, facts(X), Xs), length(Xs, L).

Prologには関数ではなく述語があるため、言うことはできないことに注意してlength(findall(...), L)ください(質問へのコメントでWill Nessが指摘したように)!

リストのリストを作成するのは奇妙で不必要です。なぜそれが必要なのかよくわかりません (何か重要なことが抜けている場合は詳しく説明してください)。

使用flatten/2することは犯罪ではありませんが、通常は設計上の決定が不適切であることを示しています。

于 2013-12-16T06:28:39.337 に答える