properName(X)
は単なる単項規則です (DCG のコンテキストでは、これは Prolog の 3 項述語です - で確認してください?- listing(properName)
)。あなたはそれを「靴下」または「ジャム」と呼ぶことができたでしょう、それは完全にあなた次第です. したがって、適切な名前「john」または「mary」を表す意味に関する知識は、コードのどこにもありません (自己文書化機能として命名を使用しますが、文書化はコードではありません)。
述語は、アトムjohn
またはmary
入力ストリームに存在することを許可し、それ以外は何も許可しません。X
そして、その原子と一体化することを要求します。
次のように定義できます。
name(X) --> [X], { member(X, [john, mary]) }.
それから、
4 ?- phrase( name(X), [john,jack], Z).
X = john,
Z = [jack] ;
false.
5 ?- phrase( name(X), [jack,john], Z).
false.
8 ?- phrase( name(X), [john,mary], Z).
X = john,
Z = [mary] ;
false.
9 ?- phrase( name(X), [mary,john,jack], Z).
X = mary,
Z = [john, jack].
11 ?- phrase( name(jack), [jack,mary,john], Z).
false.