----------------------------------------
% 域说明
% 指定类型,前两个为符号(symbol),后一个为整数(integer)
domains
name=symbol.
sex=symbol.
age=integer.
% 谓词说明
% 括号内为相应的参数
% 以person为例,通俗的说人有三个属性,姓名name,性别sex
% 年龄age。
% 而mother有两个参数——两个名字
predicates
person(name,sex,age)
mother(name,name)
father(name,name)
uncle(name,name)
aunt(name,name)
grandfather(name,name)
grandmother(name,name)
% 目标说明
% 以第一组为例,名字1是名字2的叔叔,那么就输出一条信息(write)
% 注意逗号“,”是逻辑上的and
goal
uncle(Name1,Name2),
write(Name1," is",Name2,"'s uncle!\n "),
aunt(Name3,Name4),
write(Name3," is",Name4,"'s aunt!\n "),
grandfather(Name5,Name6),
write(Name5,"is ",Name6,"'s grandfather!\n "),
grandmother(Name7,Name8),
write(Name7,"is ",Name8,"'s grandmother!\n ").
% 子句集
% 以第一个为例,陈述了一个事实:
% 有一个人,他的名字的是a,性别是男m(man),年龄是21
% 而mother(e, a)则陈述了这样一个事实,e是a的妈妈mother
% 其它的类似
clauses
person(a,m,21).
person(b,m,22).
person(c,w,23).
person(d,w,24).
mother(e,a).
mother(e,b).
mother(e,c).
mother(e,d).
mother(c,f).
father(a,g).
father(g,h).
% 叔叔的定义,这是规则
% 谓词predicate包括两种,fact和rule,事实就是上面那种,
% 规则就是下面这种
% 简单的说,如果有Name1,Name2是人person,并且具有共同的
% 母亲Z,并且Name1比Name2的年龄大Age1>Age2,那么Name1
% 就是Name2的叔叔uncle
% rule由三部分组成,:-为连接符,一般读作if,连接符前边的部分为head
% 后面的部分为body。
uncle(Name1,Name2):-
person(Name1,m,Age1),
person(Name2,m,Age2),
mother(Z,Name1),
mother(Z,Name2),
Age1>Age2.
aunt(Name3,Name4):-
person(Name3,w,Age3),
person(Name4,w,Age4),
mother(Z,Name3),
mother(Z,Name4),
Age3>Age4.
grandfather(Name1,Name2):-
father(Name1,Y),
father(Y,Name2).
grandmother(Name7,Name8):-
mother(Name7,X),
mother(X,Name8).
第一个用Prolog写其实很简单,不过我不记得怎么写了,只好用C++。#include<iostream>
using namespace std
int fun1(int a,int b){
return a|b
}
int fun2(int a,int e,int f){
return (a&e&~f)|(a&~e&f)|(~a&e&f)
}
int fun3(int b,int c){
return ~(b^c)
}
int fun4(int a,int d){
return a^d
}
int fun5(int c,int d){
return c^d
}
int fun6(int d,int e){
return ~d|e
}
void output(int a,int b,int c,int d,int e,int f){
if(a) cout<<"A "
if(b) cout<<"B "
if(c) cout<<"C "
if(d) cout<<"D "
if(e) cout<<"E "
if(f) cout<<"F "
cout<<endl
}
int main(){
for(int a=0a<2a++)
for(int b=0b<2b++)
for(int c=0c<2c++)
for(int d=0d<2d++)
for(int e=0e<2e++)
for(int f=0f<2f++)
if(fun1(a,d)&fun2(a,e,f)&fun3(b,c)&fun4(a,d)&fun5(c,d)&fun6(d,e)) output(a,b,c,d,e,f)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)