我看了关于两个谓词的说明,
仍无法体会其差异,
了解的高手说明一下,谢谢!
p.s. 在swi-prolog里查询help(forall).就可以看其说明。
仍无法体会其差异,
了解的高手说明一下,谢谢!
p.s. 在swi-prolog里查询help(forall).就可以看其说明。
Mercury Liao 写道:我看了关于两个谓词的说明,
仍无法体会其差异,
了解的高手说明一下,谢谢!
p.s. 在swi-prolog里查询help(forall).就可以看其说明。
man('John').
man('Josh').
girl('Betty').
girl('Joan').
father('John', 'Betty').
father('Josh', 'Joan').
man('John') :- write('Take John'),nl.
man('Josh') :- write('Take Josh'),nl.
girl('Betty').
girl('Joan').
father('John', 'Betty') :- write('Test John'),nl.
father('Josh', 'Joan') :- write('Test Josh'),nl.
?- foreach(man(M), father(M,_)).
Take John
Take Josh
Test John
false.
?- forall((between(2,3,X),between(1,9,Y)),
(write(X),write('*'),write(Y),write('='),N is X*Y,write(N),nl)).
yauhsien 写道:我写了一点什麽发送之後,发现没把差别讲得很明白,所以删掉。
说foreach(:Generator, :Goal)对Generator找到的每个事实都有一个Goal的复制,并且每个Goal复制都串接起来。後者就是最大的差别,forall/2是对每个事实都做一个动作,foreach/2则是把每个事实的检查合并。
以人际关系看
从Generator找到 M='John', M='Josh' ,把Goal复制并串接就是 father('John',_), father('Josh',_) 。如果trace可以看到运行过程是先找到father('John','Betty'),然後检查father('Josh','Betty')得到false。这句的意思是 "找到众人之父" ,这个foreach/2看起来比较接近逻辑学的那个for-all符号。同样一个找爸爸,用forall/2写起来的意思应该是 "找出全部的爸爸" 。
- 代码:
man('John') :- write('Take John'),nl.
man('Josh') :- write('Take Josh'),nl.
girl('Betty').
girl('Joan').
father('John', 'Betty') :- write('Test John'),nl.
father('Josh', 'Joan') :- write('Test Josh'),nl.
?- foreach(man(M), father(M,_)).
Take John
Take Josh
Test John
false.
至於forall/2,谓词模板写成forall(:Cond, :Action),它除了提到 "以伪驱使的循环" 之外,提到可以把Action做成有副作用的作法。或许可以用来实现C语言的for循环,例如2x1~3x9乘法表,
- 代码:
?- forall((between(2,3,X),between(1,9,Y)),
(write(X),write('*'),write(Y),write('='),N is X*Y,write(N),nl)).
您在这个论坛的权限:
您不能在这个论坛回复主题