我正在尝试编写一个函数来测试单词 hello 是否包含在列表中。如果它被包含,我不希望它说“真实”,我希望它说:“是的,这里包含 hello 这个词”,有什么想法吗?
这是我的代码:
contains_hello([hello|_]).
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail).
我正在尝试编写一个函数来测试单词 hello 是否包含在列表中。如果它被包含,我不希望它说“真实”,我希望它说:“是的,这里包含 hello 这个词”,有什么想法吗?
这是我的代码:
contains_hello([hello|_]).
contains_hello([Head|Tail]):- Head \= hello, contains_hello(Tail).
从您的代码中可以清楚地看出,您只希望将消息打印一次。目前,您通过添加Head \= hello
到第二个子句来解决这个问题。这不是在 Prolog 中通常解决此问题的方式。
请注意,您的第二个子句恰好排除了第一个子句匹配的情况。因此,在第一个子句中切入要方便得多。这将停止回溯。即,如果第一个子句匹配,则不考虑第二个子句。
感叹号 ( !
) 表示切割。因此:
contains_hello([hello|_]) :-
write('yes, the word hello is contained here'), nl, !.
contains_hello([_|T]) :- contains_hello(T).
This is untested but try:
contains_hello([hello|_]) :-
write('yes, the word hello is contained here'),
nl.
contains_hello([Head|Tail]) :- Head \= hello, contains_hello(Tail).