2017-03-17 10 views
0

さて一致させる必要があり、特定の事実のフォーマットを持っています事実は正しく。私はいくつかの方法を試しましたが、私はこれについて私の理解に根本的に何か間違っていると思います。これは問題に関する私のコードの一部です:Prologは私は基本的に私の先生は私たちに事実のために特定の形式を与え、私は

male(X) :- m(Males), member(X, Males). 
female(X) :- f(Females), member(X, Females). 
parent(X,Y) :- (family([X,_,Child]); family([_,X,Child])), member(Y,Child). 

m(['David', 'Lance', 'Charles', 'George', 'Henry', 'Jose', 'Lenny', 'Vance', 'Rhett', 'Jacob', 'Mike']). 
f(['Sarah', 'Tammy', 'Jasmine', 'Cassondra', 'Kat', 'Laura', 'Tamarah', 'Nina', 'Stephanie', 'Christen', 'Shannon', 'Maryalice']). 
family(['David', 'Sarah', ['George', 'Kat']]). 

しかし私は試してみますか? - 男性(ホセ)。それはJose = 'David'を返します。誰が何が間違っているかについていくつかの洞察を持っていますか?私は本当に助けに感謝します。

編集: ありがとうございました。私はそれが単なる単純な間違いだったと思うが、私は助けなしにそれを実現しただろうとは思っていない。私は今働いている。

+1

'Jose'は**プロローグ**変数です。おそらく '? - male( 'Jose')に問い合わせることを意味していました。' 'Jose ''の一重引用符に注意してください。 – mat

+0

それは、ありがとう。 –

答えて

0

プロローグの「変数」は大文字で始まります。原子である "リテラル"を作成したい場合は、それらを単一引用符で囲みます。私は正確なルールを(SWI-Prologのために、私は推測)学ぶためにSWI-PrologのCHAR_TYPEに使用することが有用であることが分かっ

...あなたは「引用符で囲まれていないPrologの原子を起動したり、prolog_atom_start「Prologの変数名を開始」prolog_var_startを使用することができますこれはシンボルではありません」

?- bagof(C, char_type(C, prolog_var_start), Cs) ; true. 
Cs = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'|...] [write] 
Cs = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ'] ; 
true. 

?- bagof(C, char_type(C, prolog_atom_start), Cs). 
Cs = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, ª, µ, º, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ø, ù, ú, û, ü, ý, þ, ÿ]. 
1

これはあなたが質問しなかった質問に対する回答です。実際はコメントにする必要があります。しかし、それはコメントのために長くする方法です。 :)

プログラムの編成、柔軟性、および効率性のために、集約リストではなく、個別の事実としてあなたの事実を主張するのが最善です。例えば、mためのあなたのケースでは、あなたが持っている:他の言語のよう

m([first_male_name, second_male_name,...,last_male_name]). 

を、それはあなたの事実、述語、および変数賢明な名前を与えることもお勧めします。それでは、この1の名前を変更してみましょう:

males([first_male_name, second_male_name,...,last_male_name]). 

はあなたがPersonNamemaleであるという条件を持つ述語を持っているとしましょう。上記の事実と、ここでそれが行われるかもしれない方法は次のとおりです。

some_predicate(...) :- 
    ... 
    males(ListOfMales), 
    member(PersonName, ListOfMales), 
    ... 
代わりに、あなたは個々の事実を使用する必要があります

male(first_male_name). 
male(second_male_name). 
... 

次に、あなたの述語は次のようになります。

some_predicate(...) :- 
    ... 
    male(PersonName), 
    ... 

あなたはしないでくださいあなたが今持っている述語male/1さえ必要です。 female/1についても同様です。

familyについては、それぞれの関係はそれ自身の事実でなければなりません。むしろよりも、このような家族を定義するためのリストを持つ単一の、複雑な事実定義:次にparent(X, Y)になる

parents_child(father, mother, child1). 
parents_child(father, mother, child2). 
... 

parent(X, Y) :- 
    parents_child(_, X, Y) ; parents_child(X, _, Y). 
これを定義するために、より一般的な方法は次のようになり

family([father,mother,[child1,...,childn]]). 

さらに、最も柔軟性がある場合(など、、壊れた家族の場合、または両親が再婚した場合など):

father_child(father、child1)。 father_child(father、child2) ... mother_child(マザー、子供1)。 mother_child(mother、child2)。 ...

次に、あなたが持っている:

parent(X, Y) :- 
    father_child(X, Y) ; mother_child(X, Y). 
関連する問題