2

在下面的代码中,我正在尝试搜索列表并在列表中有匹配项时打印“匹配”,如果没有匹配项则打印“不匹配”。如果有匹配项,我的代码会打印“匹配”,但是如果没有匹配项,则不打印“不匹配”而是返回 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')).
4

1 回答 1

3

您需要添加一个在on到达列表末尾时捕获案例的子句:

on(_, [], X) :- X is 0.

但是,为了使其工作,您需要!在匹配on子句中放置一个剪切运算符 , ,这样它就不会继续并找到空列表匹配子句:

on(Item,[Item|_], X) :- X is 1, !.

此外,您的打印代码似乎没有按照您的意愿执行,我认为它应该类似于:

(Z == 1 -> write('match'); write('no match')).

(注意->那里)。我不肯定这是正确的,但我必须对其进行更改以使其在我的身上正常工作。

最后,为了让你的代码看起来更漂亮一点,你可以将X is 0andX is 1东西放入谓词本身,所以它变成:

on(_, [], 0).
on(Item, [Item|_], 1) :- !.
于 2013-04-15T04:05:07.177 回答