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

Prolog,如何在write()中显示多个输出,prolog,Prolog,嗨,这是我的代码…但它只能显示1个输出…但是在匹配(X,Y)中有3对匹配。如何在我的go函数中显示它们 谢谢你,Prolog是一种懒惰的语言。这意味着一旦发现了使问题成为现实的条件,它就会停止。这将是第一场单独的比赛 如果您的代码正常工作(我还没有尝试过),那么您应该尝试运行prolog检查器中的match-语句:match(X,Y) prolog inspector将返回所有状态并为您打印。如果您强制回溯,您将获得所有匹配项,通常是通过输入(例如,在SWI Prolog中)。但您也会看到您得到

嗨,这是我的代码…但它只能显示1个输出…但是在匹配(X,Y)中有3对匹配。如何在我的go函数中显示它们


谢谢你,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).