1

このプログラムを考えると、匿名であっても、述語内のすべてのアトムを定義する必要があるのはなぜですか。dict述語の未定義変数が匿名と見なされないのはなぜですか?

funt2(X) :-
    X = point{x:5, y:6}.

evalfunt(point{x:5, y : 6}) :-
    write('hello world!').

evalfunt(point{x:_, y : _} ) :-
    write('GoodBye world!').

なぜ私はただ言うことができない

evalfunt(point{x:5}) :-
        write('GoodBye world!').

^ちなみに、それは一致しません。

辞書を使用するために辞書内のすべての可能な値を定義する必要がある場合は、構造を使用することもできます。

ここでの動機は何ですか?述語を簡潔にするために何かできることはありますか? 30 個の変数で dict を定義しようとしていますが、これは大きな障害です。各変数 (匿名かどうかに関係なく) を定義する必要がある場合、プログラムのサイズが大幅に増加します。

4

2 に答える 2

4

Dict は、データ AND 構造を持つタプルのような単なる複雑なデータ型です。たとえば、次の 2 つの事実があるとします。

fact(point{x:5, y:6}).
fact(point{x:5}).

次に、クエリ

fact(point{x:_}).

2 番目のものには一致しますが、最初のものには一致しません。そしてクエリ

fact(point{x:_, y:_}).

最初のものには一致しますが、2 番目のものには一致しません。

fact(point{x:_, y:_, z:_})ここで、特定の 1 つのフィールドのみでフォームのファクトを一致させたい場合は、いつでもヘルパー ルールを記述できます。

matchByX(X, P) :- fact(P), P=point{x:X, y:_, z:_}. 

だから事実を持っている:

fact(point{x:5, y:6, z:1}).
fact(point{x:1, y:2, z:3}).
fact(point{x:2, y:65, z:4}).

そして質問する

matchByX(1, P).

戻ります:

P = point{x:1, y:2, z:3}


更新:
さらに、SWI-Prolog 7 バージョンでは、フィールド名も一致させることができるため、構造が異なるファクトであっても、より一般的な方法で記述できます。

fact(point{x:5, y:6, z:1}).
fact(point{x:1, y:2}).
fact(point{x:2}).
fact(point{x:2, y:2}).

matchByField(F, X, P) :- fact(P), P.F = X.

クエリ:

?- matchByField(x, 2, P).
P = point{x:2} ;
P = point{x:2, y:2}.
于 2015-03-23T15:03:12.350 に答える
1

次のことを行うことで、必要なことを達成できました

checkiffive(Y) :- 
        get_dict(x, Y, V), V=5.

辞書から値を統合するには、組み込みのメソッドを使用する必要があります。

SWI プロローグ リファレンスの 5.4 章に記載

http://www.swi-prolog.org/download/devel/doc/SWI-Prolog-7.1.16.pdf

于 2015-03-23T15:09:35.883 に答える