11

私はそれをしましたが、それは答えを示していません私が兄弟、姉妹、叔父、叔母について尋ねるとき

これは私が書いたものです、何が問題なのですか?

/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/

uncle(X,Y) :-
  parent(Z,Y), brother(X,Z). 

aunt(X,Y) :-
  parent(Z,Y), sister(X,Z). 

sibling(X, Y) :-
      parent(Z, X),
      parent(Z, Y),
      X \= Y.

sister(X, Y) :-
      sibling(X, Y),
      female(X).

brother(X, Y) :-
      sibling(X, Y),
      male(X).

parent(Z,Y) :- father(Z,Y).
parent(Z,Y) :- mother(Z,Y).

grandparent(C,D) :- parent(C,E), parent(E,D).

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y).
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).

male(john).
male(bob).
male(bill).
male(ron).
male(jeff).

female(mary).
female(sue).
female(nancy).

mother(mary, sue).
mother(mary, bill).
mother(sue, nancy).
mother(sue, jeff).
mother(jane, ron).

father(john, sue).
father(john, bill).
father(bob, nancy).
father(bob, jeff).
father(bill, ron).

sibling(bob,bill).
sibling(sue,bill).
sibling(nancy,jeff).
sibling(nancy,ron).
sibling(jell,ron).

そしてもう1つ、Xがそれ自体の兄弟にならないように、兄弟のルールを最適化するにはどうすればよいですか。

4

6 に答える 6

7

図を複製しようとしている場合、公理の一部が間違っているか、欠落しているようです。

ない:

female(jane).

father(john, bob).

違う:

father(john, sue).

これにより、兄弟ルールが競合する可能性があります。しかし、私はプロローグについて何を知っていますか

于 2009-03-25T00:14:03.070 に答える
3

あなたの兄弟のルールは、すでに確認のためにチェックを行う をbrother(bob, bob)呼び出しているため、それが失敗することを確認しています。sibling(X, Y)X \= Y

また、私のマシンではすべてが機能しているように見えますが、これらの行のダッシュを変更する必要がありました。

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y).
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).

に:

aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y).
aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).

ええ、それらは同じように見えますが、最上位バージョンのダッシュはわずかに長くなっています...そして、ファイルを「調べた」ときに問題を引き起こすようでした.

Notepad ++のProlog配色を作成したため、それを見つけただけです。興味がある場合は、オンラインで投稿できます。

于 2009-03-25T00:15:08.357 に答える
1

X はそれ自体の兄弟ではないため、兄弟のルールを最適化します。

やったほうがいい:

brother(X, Y) :-
      sibling(X, Y),
      male(X),
      not X=Y.
于 2009-04-20T20:52:10.333 に答える
1

aunt/2 の述語はまとめられていないため、Prolog は grandparent/2 が aunt/2 であると想定します。以下のようにまとめて配置するか、使用します

:- discontiguous(aunt/2).

あなたは配偶者/2を使用していますが、それを定義していません。さらに、Prolog は sibling/2 述語がどこかにあるはずであると想定し、father/2 を使用します。これは、KB の下部で兄弟のリストを定義しているためです。ここでも、以下のようにまとめて配置します。

他の回答で述べたように、not(X = Y) を使用できます。

parent(Z,Y) :- father(Z,Y) ; mother(Z,Y).

sibling(bob,bill).
sibling(sue,bill).
sibling(nancy,jeff).
sibling(nancy,ron).
sibling(jell,ron).

sibling(X,Y) :-
    parent(A,X),
    parent(A,Y),
    not(X = Y).


sister(X, Y) :-
      sibling(X, Y),
      female(X),
      not(X = Y).

brother(X, Y) :-
      sibling(X, Y),
      male(X),
      not(X = Y).

grandparent(C,D) :- parent(C,E), parent(E,D).

aunt(X,Y) :-
  parent(Z,Y), sister(X,Z). 
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y).
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

uncle(X,Y) :-
  parent(Z,Y), brother(X,Z). 


male(john).
male(bob).
male(bill).
male(ron).
male(jeff).

female(mary).
female(sue).
female(nancy).
female(jane).

mother(mary, sue).
mother(mary, bill).
mother(sue, nancy).
mother(sue, jeff).
mother(jane, ron).

father(john, sue).
father(john, bill).
father(bob, nancy).
father(bob, jeff).
father(bill, ron).
于 2016-05-10T16:33:59.133 に答える