我正在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很新,所以这可能是一个愚蠢/简单的问题,谢谢!
答案 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).