Prolog,如何在write()中显示多个输出
嗨,这是我的代码…但它只能显示1个输出…但是在匹配(X,Y)中有3对匹配。如何在我的go函数中显示它们Prolog,如何在write()中显示多个输出,prolog,Prolog,嗨,这是我的代码…但它只能显示1个输出…但是在匹配(X,Y)中有3对匹配。如何在我的go函数中显示它们 谢谢你,Prolog是一种懒惰的语言。这意味着一旦发现了使问题成为现实的条件,它就会停止。这将是第一场单独的比赛 如果您的代码正常工作(我还没有尝试过),那么您应该尝试运行prolog检查器中的match-语句:match(X,Y) prolog inspector将返回所有状态并为您打印。如果您强制回溯,您将获得所有匹配项,通常是通过输入(例如,在SWI Prolog中)。但您也会看到您得到
谢谢你,Prolog是一种懒惰的语言。这意味着一旦发现了使问题成为现实的条件,它就会停止。这将是第一场单独的比赛 如果您的代码正常工作(我还没有尝试过),那么您应该尝试运行prolog检查器中的
match
-语句:match(X,Y)
prolog inspector将返回所有状态并为您打印。如果您强制回溯,您将获得所有匹配项,通常是通过输入
代码>(例如,在SWI Prolog中)。但您也会看到您得到了不必要的输出true
。这是因为go
中的最后一个子句是match(Mn1,Fn1)
。此子句成功三次,并绑定变量Mn1,Fn1
,但随后只输出true
,因为在该子句之后没有write()
。第四次match(Mn1,Fn)
失败,通过回溯,您返回到匹配的第一个子句match(Mn,Fn)
,然后输出匹配,以此类推
你肯定不想有这种行为。您应该删除go
中的最后一个子句match(Mn1,Fn1)
。现在按代码>获得3个匹配项,其间没有任何输出true
但你可能想要的是,程序进行回溯。要实现这一点,您只需通过添加false
作为最后一个子句来强制回溯。要获得正确的输出格式,请使用以下程序。添加最后一个子句go2.
,以在末尾获得true
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.
这种技术称为故障驱动循环。如果有任何谓词具有多个结果,并且希望找到所有结果,则应使用findall/3
例如,在您的情况下,您可以执行以下操作:
go2 :- write('--Matching Result--'), nl,
match(Mn,Fn),
write(Mn), write(' match with '), write(Fn), nl,
fail.
go2.
L将是一个列表,其中包含满足[X,Y]格式的匹配(X,Y)的所有X,Y。
例如,假设:
findall([X,Y], match(X,Y),L).
结果将是L=[[m1,f1],[m2,f2]]
请注意,您可以根据需要定义格式,例如,您可以编写:
match(m1,f1).
match(m2,f2).
然后您必须在列表上递归以打印它们
但是,如果您希望找到一个结果,请运行一些代码,然后继续。您可以使用for all/2:
findall(pair(X,Y), match(X,Y), L).
L = [ pair(m1,f1), pair(m2,f2) ]
findall( X, match(X,Y), L).
L = [ m1, m2]
findall( 42, match(X,Y), L).
L = [42, 42]
如果你想让你的代码在SO中看起来很好,用4个空格缩进它,或者选择你所有的代码,然后按{}
按钮。我知道,我可以通过匹配(X,Y)来显示它们。在我的go函数中是否有其他方式来显示其余的代码?但不匹配(X,Y)。我确实明白你在这里说的懒话是什么意思;然而,我认为这有点误导,因为大多数时候lazy指的是lazy评估(prolog实际上没有)
forall(match(X,Y), my_print(X,Y).