Prolog:交换列表的两半

时间:2017-12-10 19:09:48

标签: prolog

我正在prolog中编写一个谓词,它会将包含偶数个变量的列表分成两半并交换它们。例如[a,b,c,d] - >并[c,d,A,B]。

append([], List, List).
append([Head|Tail], List, [Head|Rest]) :- 
   append(Tail, List, Rest).

divide(L, X, Y) :-
   append(X, Y, L),
   length(X, N),
   length(Y, N).

swap([], []).
swap([A], D) :-
   divide(A, B, C),
   append(C, B, D).

我希望通过将[A]分成两个较小的相等大小的列表,然后以相反的顺序将它们一起添加,然后分配变量" D"列表。

我得到的是"假",为什么这不起作用?
我对prolog很新,所以这可能是一个愚蠢/简单的问题,谢谢!

2 个答案:

答案 0 :(得分:2)

您的问题是public function contact(Request $request){ $to = 'contact@email.com'; $from = $request->input('email'); $subject = $request->input('subject'); $message = $request->input('message'); $headers = 'From: '.$from . "\r\n" . 'Reply-To: '.$from . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers); return view('contact'); } 失败的原因。这是实际的原因:

?- swap([_/*a*/,_/*b*/|_/*,c,d*/],_/*[c,d,a,b]*/).

:- op(950, fy, *).
*(_).

swap([], _/*[]*/).
swap([A], D) :-
   * divide(A, B, C),
   * append(C, B, D).

因此,您的原始查询不仅会失败,而且即使此泛化也会失败。即使你问

swap([a,b,c,d],[c,d,a,b])

你只是失败了。看到了吗?

你也可以反过来问它。通过以上概括,我们可以问:

?- swap([_,_|_],_).
false.

因此,您的第一个参数必须是空列表或仅一个元素列表。你当然想要描述更长的名单。

答案 1 :(得分:0)

也许有帮助

:- use_module(library(lists), []).

 divide(L, X, Y) :-
 append(X, Y, L),
 length(X, N),
 length(Y, N).

 swap([], []).
 swap(L, D) :-
 divide(L, B, C),
 append(C, B, D).