firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
的问题是即时通讯只允许使用递归与谓语“firstlast”。 ? 我真的试图打破这一点,但我似乎无法检查/比较最后一个元素与第一个。
任何提示?
firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
的问题是即时通讯只允许使用递归与谓语“firstlast”。 ? 我真的试图打破这一点,但我似乎无法检查/比较最后一个元素与第一个。
任何提示?
UPDATE:既然你不能使用其他谓词,试试这个:
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
的与基本情况第一断言交易,第二个在三的列表中删除第二个元素更多的项目,并递归下来。
您可能表示第一个和最后一个元素是相同的。下面是使用dcg -notation一个解决方案:
firstlast(Xs) :- phrase(([X],...,[X]), Xs). ... --> [] | [_], ... .
我不知道firstlast([1])
是否成功与否......
好,因为你只能使用与firstlast/1,递归的解决方案看起来像:
firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
其中一些将是关于基本情况的规则,其中一些是“消除”问题的规则。 这个问题需要一个检查:比较第一个和最后一个元素。所以,在你的基本情况下,你应该只有这2个元素;你不需要别的东西。因此该解决方案将忽略所有其他元素
最后提示:你可以用下面的统一模式访问列表的2个第一要素:
foo([H1,H2|T])
所以公平我得到这个:
firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
我的代码比较了最后一个元素和第一个元素,但递归是错误的:/
如上所述,它不应该被允许与列表中的一个元素成功。 虽然我只允许使用谓词“firstlast”。
如果您将其添加到问题本身,而不是将其作为答案发布,则此代码将更加可见。您随时可以通过点击编辑链接编辑您的问题。 – dasblinkenlight
'Xs = [f,Xs],firstlast(Xs).'成功。这是打算? – false
@false我刚刚在SWI中试过这个,我弄错了,我错过了什么? (注意:我编辑了我的答案,第一行有一个错字 - 它表示“last(X,list)'而不是'last(X,List)') – dasblinkenlight
'first(H,H).' must be除去。 – false