2

我正在尝试编写一个函数来测试单词 hello 是否包含在列表中。如果它被包含,我不希望它说“真实”,我希望它说:“是的,这里包含 hello 这个词”,有什么想法吗?

这是我的代码:

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

2 回答 2

4

从您的代码中可以清楚地看出,您只希望将消息打印一次。目前,您通过添加Head \= hello到第二个子句来解决这个问题。这不是在 Prolog 中通常解决此问题的方式。

请注意,您的第二个子句恰好排除了第一个子句匹配的情况。因此,在第一个子句中切入要方便得多。这将停止回溯。即,如果第一个子句匹配,则不考虑第二个子句。

感叹号 ( !) 表示切割。因此:

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

contains_hello([_|T]) :- contains_hello(T).
于 2009-11-17T20:35:38.170 回答
3

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).
于 2009-11-17T16:02:39.853 回答