如何比较序言中列表的最后一个元素与另一个列表的最后一个元素?

时间:2019-04-30 13:00:54

标签: list prolog

我想找到一首诗的押韵对联,所以我需要比较这首诗两节的最后一个音节。

cmp([A|As], [B|Bs]) :- cmp(As, A, Bs, B).

cmp(A, [B], B, [A]).
cmp([_, A|As], X, [_, B|Bs], Y) :- cmp([A|As], X, [B|Bs], Y).

例如,我需要检查“ [他们把我放在烤箱里烤],“ [我,一个,被剥夺的,可怜的蛋糕]]押韵,所以我想我应该检查这两个列表的最后一个元素是否相同。

使用此代码,我试图比较列表中的第一个元素和最后一个元素,但是它们都不起作用。

2 个答案:

答案 0 :(得分:1)

某些Prolog系统提供了一个列表库,其中包含可以调用的last/2谓词。通常的定义是:

last([Head| Tail], Last) :-
    last(Tail, Head, Last).

last([], Last, Last).
last([Head| Tail], _, Last) :-
    last(Tail, Head, Last).

请注意,在使用绑定列表调用谓词时,由于第一参数索引,此定义避免了虚假的选择点。

使用last/2谓词,您可以编写:

compare_verses(Versus1, Versus2) :-
    last(Versus1, Word1),
    last(Versus2, Word2),
    same_last_syllable(Word1, Word2).

您现在需要定义same_last_syllable /2谓词。这将需要将一个单词分解成一个音节列表。这似乎并不简单(例如,参见https://www.logicofenglish.com/blog/65-syllables/285-how-to-divide-a-word-into-syllables),而且我不知道执行该操作的开源Prolog库。

答案 1 :(得分:0)

听起来您至少需要一种方法来识别列表的最后一个元素:

last_of( [X], X ).
last_of( [_|X], Y ) :- last_of(X, Y).