在查询中调用事实

时间:2019-04-01 14:01:40

标签: prolog

这是我的代码:

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和{{1 }}。

但是,如果我尝试['a','l','e','g','r','e']lastWord(X, sentence).,我会得到lastWord(X, sentence(Y)).

如何在lastWord中“调用”已定义的列表(在这种情况下为“句子”)?

1 个答案:

答案 0 :(得分:2)

Prolog不是一种功能语言。因此,在诸如lastWord(X, sentence)lastWord(X, sentence(Y))之类的目标中,不会用sentence谓词的参数替换sentence(Y)sentence/1。请尝试:

?- 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].