这是我的代码:
sentence([['o'],['m','e','n','i','n','o'],['a','l','e','g','r','e']]).
lastWord(X,[X]).
lastWord(X,[_|Z]) :- lastWord(X,Z).
如果我尝试lastWord(X,[1,2,3]).
甚至lastWord(X,[['o'],['m','e','n','i','n','o'],['a','l','e','g','r','e']]).
我会得到我想要的(当然,这是列表的最后一个元素(在示例中,3
和['a','l','e','g','r','e']
.
但是如果我尝试lastWord(X, sentence).
或lastWord(X, sentence(Y)).
我会false
.
如何在lastWord中"调用"定义的列表(在本例中为"句子"(?
Prolog不是一种函数式语言。因此,在诸如lastWord(X, sentence)
或lastWord(X, sentence(Y))
之类的目标中,不会用sentence/1
谓词的参数取代sentence
或sentence(Y)
。请尝试:
?- sentence(List), lastWord(Last, List).
List = [[o], [m, e, n, i, n, o], [a, l, e, g, r, e]],
Last = [a, l, e, g, r, e] ;
false.
请注意,查询还剩下一个虚假的选择点。您可以通过重写谓词的定义来消除它 lastWord/2
。类似的谓词,通常称为 last/2
,通常可从库中获得:
last([Head| Tail], Last) :-
last(Tail, Head, Last).
last([], Last, Last).
last([Head| Tail], _, Last) :-
last(Tail, Head, Last).
请注意不同的参数顺序(Prolog 编码指南建议在输出参数之前添加输入参数(。请改用此谓词:
?- sentence(List), last(List, Last).
List = [[o], [m, e, n, i, n, o], [a, l, e, g, r, e]],
Last = [a, l, e, g, r, e].