Prolog 分支警告序言中的单例变量

Prolog 分支警告序言中的单例变量,prolog,Prolog,我必须在Prolog中做一个系谱树,我的代码可以工作,但我在branch:X中不断得到警告Singleton变量,请帮助我更正我的代码,我知道我可能必须更改变量X的名称,但仍然会得到错误,我如何才能正确执行?谢谢 hombre('nicanor_ulloa'). hombre('jose_arcadio_buendia'). hombre('jose_arcadio'). hombre('aureliano1'). hombre('arcadio'). hombre('aureliano_jos

我必须在Prolog中做一个系谱树,我的代码可以工作,但我在branch:X中不断得到警告Singleton变量,请帮助我更正我的代码,我知道我可能必须更改变量X的名称,但仍然会得到错误,我如何才能正确执行?谢谢

hombre('nicanor_ulloa').
hombre('jose_arcadio_buendia').
hombre('jose_arcadio').
hombre('aureliano1').
hombre('arcadio').
hombre('aureliano_jose').
hombre('aurelianos17').
hombre('fernando_del_carpio').
hombre('jose_arcadio_segundo').
hombre('aureliano_segundo').
hombre('gaston').
hombre('jose_arcadio_nieto').
hombre('mauricio_babilonia').
hombre('aureliano_babilonia').
hombre('aureliano2').
mujer('rebeca_montiel').
mujer('ursula_iguaran').
mujer('rebeca')
...
...
...
padre(A,B):-
   hombre(A),desciende(B,A).

madre(A,B):-
   mujer(A),desciende(B,A).

diferente(A,B):-
   A\==B.

hijo(A,B):-
   hombre(A),madre(B,A);padre(B,A).

hija(A,B):-
   mujer(A),madre(B,A);padre(B,A).

hermano(A,B):-
   hombre(A),diferente(A,B), padre(X,A); madre(X,B).

hermana(A,B):-
   mujer(A),diferente(A,B), padre(X,A); madre(X,B).

tio(A,B):-
   hombre(A), hermano(X,A);hermana(X,A), padre(X,A);madre(X,B).

tia(A,B):-
   mujer(A), hermano(X,A);hermana(X,A), padre(X,A);madre(X,B).

primos(A,B):-
   hombre(A);mujer(A),tio(X,B);tia(X,B),desciende(A,X).

abuelo(A,B):-
   hombre(A), desciende(X,A), desciende(B,X).      

abuela(A,B):-
   mujer(A), desciende(X,A), desciende(B,X).  

cuñados(A,B):-
   mujer(A);hombre(A), hermano(X,A);hermana(X,A), esposos(B,X).

该警告为您提供了以下问题的线索:

hermano(A,B):-
   hombre(A),diferente(A,B), padre(X,A); madre(X,B).
事实上,使用常见的序言缩进,这一点变得更加明显:

hermano(A,B):-
   (  hombre(A),
      diferente(A,B),
      padre(X,A)
   ;  madre(X,B)
   ).
所以
A
是兄弟,如果

  • A
    是男性,与
    B
    不同,
    A
    有父亲
    X
    ,或
  • X
    B
    的母亲
换句话说:只要
B
有母亲,任何东西都可以是
a
的兄弟
B

你的意思可能是:

hermano(A,B):-
   hombre(A),
   diferente(A,B),
   desciente(A,X), % ( padre(X,A) ; madre(X,A) )
   desciente(B,X). % ( padre(X,B) ; madre(X,B) )
所以你想包括同父异母的兄弟

此外,最好使用以下定义:

diferente(A, B) :-
   dif(A, B).