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

Prolog 用于查找列表最后一个元素的序言规则,prolog,Prolog,我应该在prolog上编写一个规则,它查找列表的最后一个元素并向其中添加1。这是我到目前为止想到的。这是可行的,但我的问题是,这条规则是否可以写成其他形式: element(D ,[_|B]):- element(D, B). element(D, [X]):- D is X+1. 1我将谓词重命名为类似于last_element_incremented的东西,这将比只描述不多的元素更具描述性 2要使规则不重叠,请更改递归规则: last_element_incremented(Xinc, [

我应该在prolog上编写一个规则,它查找列表的最后一个元素并向其中添加1。这是我到目前为止想到的。这是可行的,但我的问题是,这条规则是否可以写成其他形式:

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

1我将谓词重命名为类似于last_element_incremented的东西,这将比只描述不多的元素更具描述性

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

last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(Xinc, [X|T]).
3如果使用CLPFD,可以使解决方案更通用。此外,交换子句的顺序,以便在更一般的查询中不会出现非终止问题:

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.