我正在为班级做期末作业,我想知道是否有人能指导我如何处理我剩下的这两个问题(C和D)。这是我现在的情况。我不是在找直接的答案。谁能用一个例子来指导我。我已经做了a和b的作业,就是找到所有就业的孩子和没有孩子的家庭的名字。给了我们一些实用函数,所以我们不必每次都定义一个孩子的例子。这里是家庭树数据的例子。它很长,所以我在这里只附上了一个家庭。
family(
person(melvin, brown, date(25,april,1950), unemployed),
person(alice, brown, date(2,september,1967), works(hom, 78000)),
[person(bill, brown, date(18,november,1990), unemployed),
person(grace, brown, date(18,november,1990), works(ibm, 55000)),
person(barbara, brown, date(18,november,1990), unemployed),
person(walter, brown, date(3, october, 1996), unemployed)] ).
这些是为我们定义的实用程序。
del(X, [X|Tail], Tail).
del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1).
husband(X) :- family(X, _, _).
wife(X) :- family(_, X, _).
child(X) :- family(_, _, Children), member(X, Children).
exists(Person) :- husband(Person); wife(Person); child(Person).
dateofbirth(person(_, _, Date, _), Date).
salary(person(_, _, _, works(_, S) ), S). % Salary of working person
salary(person(_, _, _, unemployed), 0). % Salary of unemployed
这是我目前的工作:
(a) 没有孩子的家庭的名字
? - family(_, person(Name, Surname, _, _), [])
(b) 所有就业儿童
? – child(person(Name, Surname, _, works (_, _)))
(c) 有就业妻子和失业丈夫的家庭的名字;
? – wife(person),
family(_, person(Name, Surname, _, works (_, _)));
husband(person),
family(_, person(Name, Surname, _, unemployed)))
(d) 父母年龄相差至少15岁的所有子女; (e) 父母年龄相差至少15岁的所有子女。
关于(c),你应该用大写字母表示变量,这将是 wife(WifePerson)
否则你的子查询 wife(person)
不能成功)。) 或者你也可以写 wife(person(Name,Surname,_,_....)
. 说到这里,你的疑问中的谓语妻子和丈夫完全是多余的。然而,我个人更愿意写成
family(Husband,Wive,_),Wive = person(_,_,_,works(_,_));false.
或妻子。
关于(d),有一个花哨的答案,要求利用皮诺公理写出父母的年龄。这将是一个很酷的功课。这个想法是
nat(0). % zero is a natural number
nat(s(X)) :- nat(X). every successor of a natural number is a natural number
现在你可以将减法定义为
sub(nat(X),nat(0),nat(X)).
sub(nat(s(X),nat(s(Y),Result) :- sub(nat(X),nat(Y),Result)
但似乎年代的定义是以一种懒惰的方式完成的.因此,你可以利用不定式谓词 is/2
而只写
AgeDiff is X - Y.