2009-11-17 4 views
2

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

Вот мой код:

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

ответ

3

Это непроверенное, но попробовать:

contains_hello([hello|_]) :- 
    write('yes, the word hello is contained here'), 
    nl. 
contains_hello([Head|Tail]) :- Head \= hello, contains_hello(Tail). 
+0

Работает отлично - спасибо! – rb58

+0

Оба решения печатает да, слово hello содержится здесь true. –

4

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

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

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

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

contains_hello([_|T]) :- contains_hello(T).