关于prolog原理的简单探究
prolog吧
全部回复
仅看楼主
level 4
tvavnjzb 楼主
只能算是prolog新手中的新手,
对prolog的工作原理也知之甚少,
怀着一颗天真的心,
做了这个不自量力的“探究”。
请各位大神能够原谅我的浅薄。
------------------------------正文--------------------------------
prolog是如此迷人。
写出以下事实
cleverMan(X):-chinese(X).
chinese(me).
chinese(you).
第一行:“中国人”是“聪明人”
第二行:“我”是“中国人”
第三行:“你”是“中国人”
然后,请教我们的“电脑”老师
1 ?- chinese(me).
true.2
?- chinese(you).
true.3
?- chinese(japanese).
false.4
?- chinese(american).
false.5
?- cleverMan(me).
true.6
?- cleverMan(you).
true.7
?- cleverMan(fool).
false.
可见电脑能够清晰地回答我们的问题。
那么,究竟是怎么实现的呢?
怎么才能让电脑变得如此“聪明智能”?
由于prolog和Lisp的相似之处,
所以我不由自主地猜想prolog也是将数据当成列表进行处理。
既然如此,
chinese(me).这样的语句就是将“me”放入chinese这个列表,
chinese(you).的作用就可想而知了。
那么当1 ?- chinese(me).这个语句执行的时候,
很容易想到是对chinese这个列表进行遍历查找,
如果有“me”这个“原子(atom)”,
则输出为“true”。
所以不难解释为什么3 ?- chinese(japanese).时,
电脑给出的答案是false了,
因为“Japanese”根本不在chinese的列表之中!
那么cleverMan(X):-chinese(X).这个语句又是用来干什么的呢?
我认为是将cleverMan的列表“指向”了chinese的列表,
所以在这个语句之后,所有的chinese都可以在cleverMan中找到,
也就不难解释我们运行5 ?- cleverMan(me).这个语句时,
为什么会是“true”了。
这就是迷雾背后的真相了吗?
如果是,
那么我们就应该能够模拟一个这样的过程。
C语言,上吧!
(注意看其中的差别!)
由图片可以看出,
我们真的做到了!
但是这就是prolog的原理吗?
不用想也知道差得远!
这只不过是prolog的皮毛中的毫毛,
一个谓词的模拟罢了。
以下源码:(估计都会被格式杀手掉,抱歉了)
#include "stdio.h"
#include "string.h"//字符串函数
char chineseList[10][10] = {""};//模拟两个列表
char cleverManList[10][10] = {""};
int count = 0;
void chinese(char *name);//模拟将原子添加到列表里
void Chinese(char *name);//模拟向电脑询问
void cleverManIsChinese();//模拟cleverMan(X):-chinese(X).
void CleverMan(char *name);
int main() {
//以下模拟源码
chinese("me");
chinese("you");
cleverManIsChinese();
//以上模拟源码 //以下模拟指令
Chinese("me");
Chinese("you");
CleverMan("me");
CleverMan("shit");
//以上模拟指令
getchar();
return 0;
}
void chinese(char *name) {
strcpy(chineseList[count],name); count = count + 1;
}
void Chinese(char *name) {
for(int i = 0;i <= 9 ;i = i + 1) {
if(strcmp(chineseList[i],name) == 0) {
printf("\ntrue");
return ;
}
}
printf("\nfalse");
return ;
}
void cleverManIsChinese() {
for(int i = 0;i <= 9 ;i = i + 1) {
strcpy(cleverManList[i],chineseList[i]);
}
}
void CleverMan(char *name) {
for(int i = 0;i <= 9 ;i = i + 1) {
if(strcmp(cleverManList[i],name) == 0) {
printf("\ntrue");
return ;
}
}
printf("\nfalse");
return ;
}
2015年02月17日 14点02分 1
level 4
tvavnjzb 楼主
好像排错版了,true的那里,如true.2后面的2应该在下一排。
2015年02月17日 14点02分 2
这种错误,捂脸...
2015年02月17日 14点02分
level 8
赞~
2015年02月18日 00点02分 3
谢谢大神的鼓励!
2015年02月18日 05点02分
@tvavnjzb 不是大神 我只是打酱油的...[不高兴]
2015年02月18日 06点02分
level 7
虽然不是不能那么探究,但那也是南辕北辙的。理解prolog的运行原理,最简单的方式就是理解它所依赖的一阶逻辑以及它做的变动(封闭世界假设),以及它是怎么模拟出这一过程的。
我初学prolog的时候,在学了工作原理后,试图在使用时用你这种命令式+修正的模式去解决问题。发现十分之绕,但用一阶逻辑主导思维的话,一切就显而易见了。
2015年02月18日 06点02分 4
level 4
tvavnjzb 楼主
还没有看完大神的回复,就已经觉得自己是小学生之辈了,完全不是一个档次的啊!感谢大神将自己经历拿出来分享!学到了许多,谢谢大神!
2015年02月18日 16点02分 5
level 1
自己写几个程序,碰几次壁,调试几次就知道怎么回事了。学编程还是靠自己。
2015年03月03日 09点03分 7
level 1
horn字句的SLD归结
2015年07月03日 03点07分 8
新手一个,对专业术语苦手啊[泪][呵呵]
2015年09月08日 06点09分
level 9
学习了
2015年08月17日 22点08分 9
谢谢大神鼓励[滑稽]
2015年08月22日 01点08分
level 9

2015年09月13日 22点09分 10
1