0

私はプロローグを使用して辞書のようなプログラムに取り組んでおり、コードは次のようになります。

define(car,vehicle).
define(car,that).
define(car,has).
define(car,four).
define(car,wheels).
define(wheels,round).
define(wheels,object).
define(wheels,used).
define(wheels,in).
define(wheels,transportation).


defined(X):-define(X,_).

anotherdefined(X):- \+ undefined(X).
undefined(X):- \+define(X,_).        

私は私に与える defined/1 述語を書こうとしています:

?-defined(X).
X = car ;
X = wheels ;
false.

それでも、私の defined/1 は、X=car.それがカウンターするたびに (当然のことながら) 5 回与えられ、私のdefine(car,_). anotherdefined/1 は私にしか与えません。true.define(car,_).define(wheels,_).

編集: 次の行を書いて、givedefinedword/1 で必要な結果を取得しました。

listdefined(X):-findall(Y,defined(Y),Z),sort(Z,X).
givedefinedword(X):-listdefined(List),member(X,List).

ただし、効率的な述語 (他の多くの述語で使用します) が必要だったので、それは目的に勝っています。この述語は処理が多すぎます。

それとも、コードを修飾する述語を使用した方が良いでしょうか? say は、定義済みの単語のリストを作成し、新しい定義が追加されたときにそれを変更します。

ありがとう。

4

2 に答える 2

0

defineアイテムとリストを関連付けるように変更すると、

definelist(car, [vehicle, that, has, four, wheels]).
% etc.
defined(X) :- definelist(X, _).

その後defined、重複を生成せず、線形スペースも必要としません。

もちろん、クエリdefine(X, Y)は として実行する必要がありますdefinelist(X, L), member(Y, L)。これも効率的にしたい場合は、すべての定義を複製する必要があるかもしれません。

于 2014-10-22T07:11:38.097 に答える