Условные заявления SWI-Пролог - PullRequest
2 голосов
/ 17 ноября 2009

Я пытаюсь написать функцию, которая будет проверять, содержится ли слово hello в списке. Если оно содержится, я не хочу, чтобы оно говорило «правда», я хочу, чтобы оно говорило: «да, здесь содержится слово« привет »», какие-либо идеи?

Вот мой код:

contains_hello([hello|_]).
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail).

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

Из вашего кода ясно, что вы хотите, чтобы сообщение печаталось только один раз . В настоящее время вы решаете это, добавляя Head \= hello ко второму предложению. Обычно это не решается в Прологе.

Обратите внимание, что ваше второе предложение исключает именно ту ситуацию, которая соответствует первому предложению. Итак, гораздо удобнее вырезать в первом предложении. Это прекращает возвращаться. То есть, если первое предложение совпадает, то второе предложение не будет рассматриваться.

Сокращение обозначено восклицательным знаком (!). Таким образом:

contains_hello([hello|_]) :-
  write('yes, the word hello is contained here'), nl, !.

contains_hello([_|T]) :- contains_hello(T).
3 голосов
/ 17 ноября 2009

Это не проверено, но попробуйте:

contains_hello([hello|_]) :-
  write('yes, the word hello is contained here'),
  nl.
contains_hello([Head|Tail]) :- Head \= hello, contains_hello(Tail).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...