如何在prolog中使用if-else提取所有数据
我是prolog的第一名 有一些家谱。所以我想抽象一个人的阿姨列表,但是,如果我使用if,而不是只抽象一个阿姨。而且,如果我不使用条件,mom也会从谓词中抽象出来 我怎样才能继续在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
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,并且谓词完成了吗?