Prolog 序言搜索列表

Prolog 序言搜索列表,prolog,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, wr

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

您需要添加一个子句,当
on
到达列表末尾时,该子句将捕获该情况:

on(_, [], X) :- X is 0.
然而,为了使其工作,您需要放置一个切割操作符,
,放入匹配的
on
子句中,这样它就不会继续并找到空列表匹配子句:

on(Item,[Item|_], X) :- X is 1, !.
此外,您的打印代码似乎没有达到您希望的效果,我认为应该是这样的:

(Z == 1 -> write('match'); write('no match')).
(注意那里的
->
)。我不能肯定这是正确的,但我必须改变它,使其正确地工作在我的

最后,为了使您的代码看起来更漂亮一点,您可以将
X是0
X是1
的内容放入谓词本身,这样它就变成:

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

谢谢,现在可以了。顺便问一下,“->”操作符是做什么的?我用的是“,”@hmdb,当我使用
时,我看到它同时显示
匹配和
不匹配。(如果您使用的是swipl,您是在打印
匹配后按
还是
?)
->
是通用的if-then运算符,请参阅。
->
都适用于我。我正在使用swi prolog,并在打印
匹配后按
,如果按
怎么办在它之后?你是对的,如果我按
,它会同时打印
匹配
不匹配