go :- match(Mn,Fn),
write('--Matching Result--'),
nl,
write(Mn),
write(' match with '),
write(Fn),
match(Mn1,Fn1).
person(may,female,25,blue).
person(rose,female,20,blue).
person(hock,male,30,blue).
person(ali,male,24,blue).
match(Mn,Fn):-person(Fn,'female',Fage,Fatt),
person(Mn,'male',Mage,Matt),
Mage>=Fage,
Fatt=Matt.
Run Code Online (Sandbox Code Playgroud)
嗨,这是我的代码...但它只能显示1输出...但匹配中有3对匹配(X,Y).如何在我的go函数中显示它们.
谢谢
Jir*_*riz 11
如果您强制回溯,通常通过输入;(例如在SWI Prolog中),您将获得所有匹配.但是你也看到你得到了不必要的输出true.这是因为最后一个子句go是match(Mn1,Fn1).该子句成功三次并绑定变量,Mn1,Fn1但只true输出,因为您不在write()该子句之后.第四次match(Mn1,Fn1)失败,通过回溯你回到match(Mn,Fn)匹配的第一个子句,输出匹配等.
你肯定不希望有这种行为.您应该删除最后一个子句match(Mn1,Fn1)在go.现在按下;你得到3场比赛true,中间没有任何输出.
但你可能想要的是该程序进行回溯.要实现这一点,您只需要通过添加false最后一个子句来强制回溯.要获得正确的输出格式,请使用以下程序.最后一个子句go2.被添加到true最后.
go2 :- write('--Matching Result--'), nl,
match(Mn,Fn),
write(Mn), write(' match with '), write(Fn), nl,
fail.
go2.
Run Code Online (Sandbox Code Playgroud)
这种技术称为故障驱动循环.
Mar*_*nix -1
Prolog 是一种惰性语言。这意味着一旦找到使您的问题成立的条件,它将停止。这将是第一场单独比赛。
如果您的代码正常工作(我还没有尝试过),那么您应该尝试match在序言检查器中运行这样的语句:match(X,Y)
prolog 检查器将返回所有状态并为您打印它们。