2012-10-10 40 views

回答

3

UPDATE:既然你不能使用其他谓词,试试这个:

firstlast([H,H]). 
firstlast([F,_|T]) :- firstlast([F|T]). 

的与基本情况第一断言交易,第二个在三的列表中删除第二个元素更多的项目,并递归下来。

+0

'Xs = [f,Xs],firstlast(Xs).'成功。这是打算? – false

+0

@false我刚刚在SWI中试过这个,我弄错了,我错过了什么? (注意:我编辑了我的答案,第一行有一个错字 - 它表示“last(X,list)'而不是'last(X,List)') – dasblinkenlight

+0

'first(H,H).' must be除去。 – false

2

您可能表示第一个和最后一个元素是相同的。下面是使用 -notation一个解决方案:

 
firstlast(Xs) :- 
    phrase(([X],...,[X]), Xs). 

... --> [] | [_], ... . 

我不知道firstlast([1])是否成功与否......

0

好,因为你只能使用与firstlast/1,递归的解决方案看起来像:

firstlast(...) :- ... . 
firstlast(...) :- ... . 
firstlast(...) :- ... . 
.... 
firstlast(...) :- ... . 

其中一些将是关于基本情况的规则,其中一些是“消除”问题的规则。 这个问题需要一个检查:比较第一个和最后一个元素。所以,在你的基本情况下,你应该只有这2个元素;你不需要别的东西。因此该解决方案将忽略所有其他元素

最后提示:你可以用下面的统一模式访问列表的2个第一要素:

foo([H1,H2|T]) 
0

所以公平我得到这个:

firstlast([H,_|T]) :- 
(T1 = H, T1 = T) -> firstlast([H|T]). 

我的代码比较了最后一个元素和第一个元素,但递归是错误的:/

如上所述,它不应​​该被允许与列表中的一个元素成功。 虽然我只允许使用谓词“firstlast”。

+2

如果您将其添加到问题本身,而不是将其作为答案发布,则此代码将更加可见。您随时可以通过点击编辑链接编辑您的问题。 – dasblinkenlight

相关问题