所以我有这个知识库
family(person(name(tom),surname(fox),date(7,may,1950),job(bbc,15200)),
person(name(ann),surname(fox),date(9,may,1951),job(unemployed)),
children[person(name(pat),surname(fox),date(5,may,1973),job(unemployed)),
person(name(jim),surname(fox),date(5,may,1973),job(unemployed))]).
family(person(name(john),surname(doe),date(7,july,1957),job(carpenter,12300)),
person(name(lucy),surname(doe),date(19,february,1969),job(clerk,13500)),
children[person(name(mary),surname(doe),date(17,january,1990),job(unemployed)),
person(name(mat),surname(doe),date(4,may,1991),job(unemployed)),
person(name(george),surname(doe),date(5,august,1993),job(unemployed))]).
family(person(name(nick),surname(brown),date(14,may,1955),job(trucker,16300)),
person(name(carmen),surname(brown),date(25,april,1957),job(unemployed)),
children[person(name(david),surname(brown),date(15,august,1977),job(unemployed)),
person(name(james),surname(brown),date(7,october,1980),job(unemployed))]).
family(person(name(daniel),surname(sturgess),date(19,november,1956),job(unemployed)),
person(name(susan),surname(sturgess),date(18,october,1957),job(manager,15400)),
children[person(name(mick),surname(sturgess),date(5,december,1982),job(unemployed))]).
而我正在尝试做的是找出一种方法来创建一个谓词妻子/ 1,它将返回所有工作的妻子,并且谓词存在/ 1将返回所有在1963年之前出生的失业父母。
我对Prolog很新(使用swi环境)所以欢迎任何帮助!
答案 0 :(得分:0)
您的数据库格式不正常,因为在Prolog中,属性通常与位置相关联。由于您为所有属性命名,因此允许一些灵活性。假设一个“工作的妻子”,这是第二个家庭/ 2有一份工作\ =失业的固定(最后)职位:
wife(W) :- family(_,W,_), W = person(_,_,_,job(Job)), Job \= unemployed.
得到所有:
?- findall(W, wife(W), Wives).
如果job / 1属性可以出现在某个其他参数位置,我们可以概括上述条款:
wife(W) :- family(_,W,_), W =.. [person|Attrs], memberchk(job(Job), Attrs), Job \= unemployed.
exists / 1可以用类似的方式处理......
修改的
校正以匹配工作属性:它出现1或2个参数:假设当一个人受雇时,s(他)将始终有工资,我们可以简化匹配工作/ 2:
wife(W) :- family(_,W,_), W = person(_,_,_,job(_,_)).