Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在prolog中使用if-else提取所有数据_Prolog - Fatal编程技术网

如何在prolog中使用if-else提取所有数据

如何在prolog中使用if-else提取所有数据,prolog,Prolog,我是prolog的第一名 有一些家谱。所以我想抽象一个人的阿姨列表,但是,如果我使用if,而不是只抽象一个阿姨。而且,如果我不使用条件,mom也会从谓词中抽象出来 我怎样才能继续在if,else female(mgrandmother). female(mom). female(sis). female(aunt1). female(aunt2). male(mgrandfather). male(dad). male(bro). male(uncle1). male(uncle2). pare

我是prolog的第一名

有一些家谱。所以我想抽象一个人的阿姨列表,但是,如果我使用if,而不是只抽象一个阿姨。而且,如果我不使用条件,mom也会从谓词中抽象出来

我怎样才能继续在if,else

female(mgrandmother).
female(mom).
female(sis).
female(aunt1).
female(aunt2).
male(mgrandfather).
male(dad).
male(bro).
male(uncle1).
male(uncle2).
parent(mom,sis).
parent(dad,sis).
parent(mom,bro).
parent(dad,bro).
parent(mgrandmother,aunt1).
parent(mgrandfather,aunt1).
parent(mgrandmother,aunt2).
parent(mgrandfather,aunt2).
parent(mgrandmother,mom).
parent(mgrandfather,mom).

aunt(X,Y):-
    parent(Z,Y), female(Z), parent(T, Z), male(T), repeat,parent(T,K),not(parent(K,Y))->X=K.

//If I printout all of aunts using like below

aunt(X,Y):-
    parent(Z,Y), female(Z), parent(T, Z), male(T), repeat,parent(T,K),not(parent(K,Y))->X=K.
//Than, It'll be print out also mom

我认为通过在
aurn/2
谓词中编写所有逻辑,会使它变得更加复杂。编写几个小的可重用谓词通常是有益的,而不是试图在单个谓词中解决整个问题。它使谓词更容易理解,而且您可以在其他谓词中重用这些组件

例如,我们可以实现一个
滑动/2
谓词:

sibling(S1, S2) :-
    parent(P, S1),
    male(P),
    parent(P, S2),
    dif(S1, S2).
现在我们的
阿姨/2
只是一个人父母的姐姐,所以:

aunt(A, C):-
    parent(P, C),
    sister(A, P).

谓词不仅更加简单,我们现在还有两个额外的谓词。此外,如果
sibling/2
的逻辑出现了一些问题,我们可以在该特定级别修复它,并且
sibling/2
的所有调用方也将得到修复。

我认为通过在
aurn/2
谓词中写入所有逻辑,会使它变得更复杂。编写几个小的可重用谓词通常是有益的,而不是试图在单个谓词中解决整个问题。它使谓词更容易理解,而且您可以在其他谓词中重用这些组件

例如,我们可以实现一个
滑动/2
谓词:

sibling(S1, S2) :-
    parent(P, S1),
    male(P),
    parent(P, S2),
    dif(S1, S2).
现在我们的
阿姨/2
只是一个人父母的姐姐,所以:

aunt(A, C):-
    parent(P, C),
    sister(A, P).
谓词不仅更加简单,我们现在还有两个额外的谓词。此外,如果
sibling/2
的逻辑出现一些问题,我们可以在该特定级别修复它,并且
sibling/2
的所有调用方也将修复。

您可能指的是“提取”,而不是“抽象”

为什么要使用
repeat
?是有人告诉你使用它还是你认为你必须使用它?与
->
相同:这里当然不需要它

以下是定义所需内容的一种方法:

aunt(Aunt, Child) :-
    parent(Parent, Child),
    siblings(Parent, Aunt),
    female(Aunt).

siblings(C1, C2) :-
    dif(C1, C2),
    parent(P, C1),
    parent(P, C2).
兄弟姐妹/2
的定义中,唯一增加的是
dif/2
,因此一个人不是自己的兄弟姐妹

您将在回溯时获得答案(您不需要使用
repeat
!):

显示所有解决方案并避免重复的简单方法是
setof/3

?- setof(Aunt-Child, aunt(Aunt, Child), Results).
Results = [aunt1-bro, aunt1-sis, aunt2-bro, aunt2-sis].
你的意思可能是“摘录”,而不是“抽象”

为什么要使用
repeat
?是有人告诉你使用它还是你认为你必须使用它?与
->
相同:这里当然不需要它

以下是定义所需内容的一种方法:

aunt(Aunt, Child) :-
    parent(Parent, Child),
    siblings(Parent, Aunt),
    female(Aunt).

siblings(C1, C2) :-
    dif(C1, C2),
    parent(P, C1),
    parent(P, C2).
兄弟姐妹/2
的定义中,唯一增加的是
dif/2
,因此一个人不是自己的兄弟姐妹

您将在回溯时获得答案(您不需要使用
repeat
!):

显示所有解决方案并避免重复的简单方法是
setof/3

?- setof(Aunt-Child, aunt(Aunt, Child), Results).
Results = [aunt1-bro, aunt1-sis, aunt2-bro, aunt2-sis].

首先,您可能不应该使用“if-else”。例如,你可以使用
dif
添加一个约束条件,以防止屈服于那个人的母亲。你的英语几乎不可理解,这不是犯罪,但它让人很难理解。@WillemVanOnsem我明白了。所以我像这样编辑代码。阿姨(X,Y):-父母(Z,Y),女性(Z),父母(T,Z),男性(T),父母(T,K),dif(K,Z)->X=K。但还有一个问题,只有阿姨1被打印出来you@User9213对不起。我的英语不好。我努力多学英语。真正地sorry@YJS不要为我感到难过,继续学习吧。你可能不应该首先使用“if else”。例如,你可以使用
dif
添加一个约束条件,以防止屈服于那个人的母亲。你的英语几乎不可理解,这不是犯罪,但它让人很难理解。@WillemVanOnsem我明白了。所以我像这样编辑代码。阿姨(X,Y):-父母(Z,Y),女性(Z),父母(T,Z),男性(T),父母(T,K),dif(K,Z)->X=K。但还有一个问题,只有阿姨1被打印出来you@User9213对不起。我的英语不好。我努力多学英语。真正地sorry@YJS别为我难过,继续学习吧。谢谢你的好意。我不对此发表评论,但我只需要打印出阿姨,没有虚假的。但是如果我真的喜欢你的代码,它会像这样返回阿姨(X,姐姐)。X=aunt1;X=aunt2;false。@YJS:
false
只是表示它找不到任何其他结果。它不是结果集的一部分,也不会打印到
stdout
,而是打印到
stderr
。噢,不是stdout而是stderr一定很好。我明白你的意思。非常感谢。谢谢你的好意。我不对此发表评论,但我只需要打印出阿姨,没有虚假的。但是如果我真的喜欢你的代码,它会像这样返回阿姨(X,姐姐)。X=aunt1;X=aunt2;false。@YJS:
false
只是表示它找不到任何其他结果。它不是结果集的一部分,也不会打印到
stdout
,而是打印到
stderr
。噢,不是stdout而是stderr一定很好。我明白你的意思。非常感谢。真的谢谢你。但是我可以删除“false”吗?它打印出了所有的aunt和谓词。真的谢谢你。但是我可以删除“false”吗?它打印了所有的aunt,并且谓词完成了吗?