hello という単語がリストに含まれているかどうかをテストする関数を作成しようとしています。含まれている場合、「本当」とは言いたくありません。「はい、こんにちはという言葉がここに含まれています」と言ってほしいのですが、何かアイデアはありますか?
これが私のコードです:
contains_hello([hello|_]).
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail).
hello という単語がリストに含まれているかどうかをテストする関数を作成しようとしています。含まれている場合、「本当」とは言いたくありません。「はい、こんにちはという言葉がここに含まれています」と言ってほしいのですが、何かアイデアはありますか?
これが私のコードです:
contains_hello([hello|_]).
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail).
メッセージを1 回だけ出力する必要があることは、コードから明らかです。現在Head \= hello
、2番目の句に追加することでこれを解決しています。これは、通常、Prolog でこれを解決する方法ではありません。
2 番目の句は、最初の句に一致する状況を正確に除外していることに注意してください。したがって、最初の節をカットする方がはるかに便利です。これにより、バックトラックが停止します。つまり、最初の句が一致する場合、2 番目の句は考慮されません。
カットは感嘆符 ( !
) で示されます。したがって:
contains_hello([hello|_]) :-
write('yes, the word hello is contained here'), nl, !.
contains_hello([_|T]) :- contains_hello(T).
これはテストされていませんが、試してください:
contains_hello([hello|_]) :-
write('yes, the word hello is contained here'),
nl.
contains_hello([Head|Tail]) :- Head \= hello, contains_hello(Tail).