Prolog,如何在write()中显示多个输出

Adr*_*ian 5 prolog

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.这是因为最后一个子句gomatch(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 检查器将返回所有状态并为您打印它们。

  • 我确实明白你的意思,我的懒惰语言在这里;但是我认为这有点误导,因为大多数时候惰性是指惰性评估(序言中实际上没有) (3认同)