用于查找列表最后一个元素的Prolog规则

时间:2018-05-27 21:02:51

标签: prolog

我应该在prolog上写一条规则,它找到列表的最后一个元素并向其添加1。这是我到目前为止所提出的。它有效,但我的问题是这条规则是否可以写成:

element(D ,[_|B]):- element(D, B).
element(D, [X]):- D is X+1.

1 个答案:

答案 0 :(得分:1)

(1)我会将谓词重命名为类似last_element_incremented的内容,而不仅仅是element更具描述性。

(2)要使规则不重叠,请更改递归规则:

last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(Xinc, [X|T]).

(3)如果您使用CLP(FD),您可以使解决方案更加通用。另外,交换子句的顺序,这样就不会出现更多常规查询的非终止问题:

last_element_incremented(Xinc, [X]) :- Xinc #= X + 1.
last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(D, [X|T]).

然后你可以查询,例如:

| ?- last_element_incremented(3, L).

L = [2] ? ;

L = [_,2] ? ;

L = [_,_,2] ? ;

L = [_,_,_,2] ? ;

(4)最后,你可以使用append/3

last_element_incremented(Xinc, L) :- append(_, [X], L), Xinc #= X + 1.