有没有办法测试任意列表是否对称?
例如:
?- symmetric([a,b,b,a]).
true.
?- symmetric([a,b,c,a]).
false.
?- symmetric([a,a]).
true.
Run Code Online (Sandbox Code Playgroud)
我的尝试是将第一个元素与最后一个元素进行比较,如果它们相等则删除它们并继续执行列表的其余部分; 否则失败.如果列表有2个元素且它们相等,则成功.否则失败.
但是,使用此谓词"查找"列表的结尾并不是真正的高效:
last(L,[L]).
last(L,[H|T]):-last(L,T).
Run Code Online (Sandbox Code Playgroud)
有谁知道这样做的好方法?真的很感激任何帮助!
顺便说一句:我不关心元素数量不均的列表.
问题是 ; 我们有一个函数拿3个参数,比如; func([[0,0,0,1,0],[0,1,1,1,0],[0,0,1,0,0],[0,0,1,0,0] ,[0,0,0,1,0]],(1,1),X)第一个是嵌套列表,显示5x5矩阵,1s表示它已满,0表示空,第二个参数( 1,1)我们的起点第1行第1列,第3个参数X是; 变量,我们将与起始点(1,1)可访问的点统一,如果被询问;
?- func ( [ [0,0,0,1] [0,0,1,0] [0,0,1,1] [0,0,1,0] ], (1,1), X).
X = (1, 1);
X = (1, 2);
X = (1, 3);
X = (2, 2);
X = (3, 2);
X = (4, 1);
X = (4, 2);
false.
Run Code Online (Sandbox Code Playgroud)
当我们从(1,1)开始时,我们可以向上,向下,向左和向右移动; 因为在(1,1)上没有向左和向上移动,如果是空的,则向右看,写下来,向下看空写下,再次进入(1,2),向右或向左或向上或向下移动,依此类推.
这里我们没有写输出的原因,(2,4)(4,4)如果例如点(2,3)是满的并且(2,4)是空的我们看我们可以去点(2) ,4)一个接一个,我的意思是,如果它们上下都是满的,我们就不能用这一点去点(2,4),因为它们已经满了.
我目前正在尝试创建一个程序,它接受两个输入一个基数和一个指数,所以基本上我要问这两个东西,例如,如果Prolog的用户输入基数2和指数3,我希望它返回8 .. ,这是我到目前为止所做的,并且不起作用:
base:- write('Input the base: '),read(X),expo(X).
exponent:- write('Input the exponent '),read(Y),expo(Y).
expo(X,Y):- A is Y*Y,B is A*X,write(B).
Run Code Online (Sandbox Code Playgroud)
请帮忙
需要做一个谓词,填充(L,X,N),其中L是一个包含N个元素X的列表.如果N <= 0或N!= L的长度,L应该是一个空列表.
这就是我所做的,我从来没有能够在Prolog中正确地使用if,else ..结构:
fill(L,X,N) :-
((N =< 0) ->
L = [];
length(L,I),
((N =\+= I) ->
L = [];
fill2(L,X,N))).
fill2([H|T],X,N2) :-
NewN = N2 - 1,
H = X,
fill2(T,X,NewN).
Run Code Online (Sandbox Code Playgroud)
我也有一个更简单的版本,除非N!= L的长度时才有效
fill(L,_,N) :-
N =< 0,
L = [].
fill([H|T],X,N) :-
NewN = N - 1,
H = X,
fill(T,X,NewN).
Run Code Online (Sandbox Code Playgroud)
因此,例如,fill(L,20,4)返回L = [20,20,20,20],但fill([20,20,20],X,2)不返回L = [].
我必须为 2x2x2 魔方编写一个解算器,但我不明白。我已经考虑过一些解决方案,但没有实现
有人能帮我吗?
我想要一个带有约束的列表列表,这是我用SWI-Prolog编写的代码:
List = [L1,L2,L3],
L1 = [X1, X2], L1 ins 1..4,
L2 = [Y1, Y2], L2 ins 1..4,
L3 = [Z1, Z2], L3 ins 1..4.
Run Code Online (Sandbox Code Playgroud)
但是,它给了ERROR:Type Error: integer expected.
如何使用尾递归在序言中实现展平列表?
这是带有简单递归的 flatten/2 代码(即没有回溯的意思):
flatten([], []).
flatten([L|Ls], FlatL) :-
!,
flatten(L, NewL),
flatten(Ls, NewLs),
append(NewL, NewLs, FlatL).
flatten(L, [L]).
?- flatten([1, [2,3], [4]], X).
X=[1,2,3,4].
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用尾递归(累加器)执行相同的算法。例如,谓词sum/2返回列表中所有成员的相加,并带有回溯:
sum([X],[X]).
sum([H|T],S) :- sum(T,S1), S is H + S1 .
Run Code Online (Sandbox Code Playgroud)
与尾递归相同的算法是
sum1(L,S) :- sum1(L,0,S).
sum1([],Acc,Acc).
sum1([H|T],Acc,S) :- Acc1 is Acc+H, s(T,Acc1,S).
Run Code Online (Sandbox Code Playgroud) 在Prolog中定义集合减法关系:
difference( Set 1, Set 2, SetDifference)
Run Code Online (Sandbox Code Playgroud)
所有三组都表示为列表.例如:
difference( [a,b,c,d], [b,d,e,f], [a,c])
Run Code Online (Sandbox Code Playgroud)
谢谢!
我需要在数字列表中找到N的最小倍数.
leastMultiple/2
leastMultipleOfThree/2,
arg1= list of numbers,arg2= X (X is what we want to find, the least multiple of 3 in a list of numbers).
Run Code Online (Sandbox Code Playgroud)
例如,在[7,9,15,22]中找到3的最小倍数.我已经盯着这个很长一段时间了,我不确定从哪里开始.如果你能简单地帮我解决一下这个问题,我会非常感激.
prolog ×10
list ×2
clpfd ×1
cube ×1
declarative ×1
logic ×1
rubiks-cube ×1
set ×1
swi-prolog ×1
symmetric ×1