Prolog 谓词

Prolog Predicates

所以我有这个知识库

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))]).

我想做的是找出一种方法来创建一个谓词 wife/1 将 return 所有工作的妻子,以及一个谓词 exists/1 return 1963年以前出生的所有失业parents

我是 Prolog 的新手(使用 swi 环境)所以欢迎任何帮助!

您的数据库采用不寻常的格式,因为在 Prolog 中属性通常与位置相关联。由于您为所有属性命名,因此允许有一定的灵活性。假设 'working wife' 它是 family/2 的第二个条目 having a job \= unemployed at fixed (last) position:

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(he) 将始终有薪水,我们可以简化匹配 job/2:

wife(W) :- family(_,W,_), W = person(_,_,_,job(_,_)).