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 に答える