Prolog谓词

时间:2015-11-28 14:27:59

标签: prolog predicate

所以我有这个知识库

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环境)所以欢迎任何帮助!

1 个答案:

答案 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(_,_)).