在下面的代码中,我试图搜索列表并打印“匹配”,如果列表中有匹配项,如果没有匹配则打印“不匹配”。如果匹配,我的代码会打印“匹配”,但是如果没有匹配则不会打印“不匹配”而是返回false。如果列表中没有匹配项,如何更改我的代码以打印“不匹配”?感谢
on(Item,[Item|_], X) :- X is 1.
on(Item,[_|Tail],X):- on(Item,Tail,X).
check(X,Y) :- on(X,Y,Z), (Z == 1, write('match');write('no match')).
答案 0 :(得分:2)
当on
到达列表末尾时,您需要添加一个捕捉案例的子句:
on(_, [], X) :- X is 0.
但是,为了完成这项工作,您需要将一个剪切运算符!
放入匹配的on
子句中,以便它不会继续并找到空列表匹配子句也:
on(Item,[Item|_], X) :- X is 1, !.
此外,看起来您的打印代码没有按照您的要求执行,我认为它应该类似于:
(Z == 1 -> write('match'); write('no match')).
(注意那里的->
)。我不肯定这是正确的,但我不得不改变它以使其在我的工作正常。
最后,为了使您的代码看起来更漂亮,您可以将X is 0
和X is 1
内容放入谓词本身,因此它变为:
on(_, [], 0).
on(Item, [Item|_], 1) :- !.