标签: prolog

Prolog:测试任意列表是否对称

有没有办法测试任意列表是否对称?

例如:

?- 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)

有谁知道这样做的好方法?真的很感激任何帮助!

顺便说一句:我不关心元素数量不均的列表.

symmetric list prolog

-1
推荐指数
1
解决办法
1119
查看次数

定义5x5矩阵

问题是 ; 我们有一个函数拿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

-1
推荐指数
1
解决办法
794
查看次数

修改SWI-Prolg顶层

是否可以对SWI Prolog的顶层进行修改?

prolog swi-prolog prolog-toplevel

-1
推荐指数
1
解决办法
107
查看次数

如何使这个Prolog程序工作

我目前正在尝试创建一个程序,它接受两个输入一个基数和一个指数,所以基本上我要问这两个东西,例如,如果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)

请帮忙

logic declarative prolog

-1
推荐指数
1
解决办法
1003
查看次数

Prolog:填充n个元素的列表

需要做一个谓词,填充(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 = [].

prolog

-1
推荐指数
1
解决办法
4825
查看次数

魔方 Prolog

我必须为 2x2x2 魔方编写一个解算器,但我不明白。我已经考虑过一些解决方案,但没有实现

有人能帮我吗?

prolog cube rubiks-cube

-1
推荐指数
1
解决办法
1924
查看次数

在Prolog中创建列表列表

我想要一个带有约束的列表列表,这是我用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.

list prolog clpfd

-1
推荐指数
1
解决办法
307
查看次数

如何使用尾递归在序言中实现展平列表?

如何使用尾递归在序言中实现展平列表?

这是带有简单递归的 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)

tail-recursion prolog

-1
推荐指数
1
解决办法
1864
查看次数

Prolog设置差异关系

在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)

谢谢!

set prolog

-2
推荐指数
1
解决办法
2311
查看次数

如何使用Prolog在数字列表中找到N的最小倍数?

我需要在数字列表中找到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

-2
推荐指数
1
解决办法
413
查看次数