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
对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 ;
}