Prolog搜索列表

时间:2013-04-15 03:41:36

标签: prolog

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

1 个答案:

答案 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 0X is 1内容放入谓词本身,因此它变为:

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