我想写谓词,它可以计算所有遇到的数字:
count(1, [1,0,0,1,0], X).
X = 2.
Run Code Online (Sandbox Code Playgroud)
我试着把它写成:
count(_, [], 0).
count(Num, [H|T], X) :- count(Num, T, X1), Num = H, X is X1 + 1.
Run Code Online (Sandbox Code Playgroud)
为什么不工作呢?
count([],0).
count([_|Tail], N) :- count(Tail, N1), N is N1 + 1.
Run Code Online (Sandbox Code Playgroud)
这计算了所有元素,但我只需要计算数字。
我正在学习Prolog,并且不明白为什么?- [] = _.在SWI-Prolog中返回true.
[]是一个空列表,_意味着它不是空的,对吧?
有人可以解释上述逻辑吗?
我试图检查行是否实际在规则集中存在的2个点之间.例如,在下面的代码中,
point(a).
point(z).
line(l,k).
line(k,l).
line(k,a).
line(a,z).
Run Code Online (Sandbox Code Playgroud)
line(a,z).是一个真正的线,因为a和z在设置规则两个点,但line(l,k).并不是真正的线,因为l并k没有在规则组真实点.
我是Prolog的新手,并且想要了解如何做到这一点.
我使用的是SWI-Prolog版本7.6.3,最近我遇到了将数字和字母组合成一个术语转换为ASCII值列表的问题.
我知道我们可以使用name/2谓词获取特定术语的ASCII值列表.例如,如果我想获得长期的ASCII值ab或者'ab',那么我们就可以使用name(ab,X).Prolog只是输出X = [97, 98],97和98分别是a和b的ASCII值.
谓词name/2也适用于数字.如果我想获得长期的ASCII值123或者'123',那么我们就可以使用name(123,X).同样,Prolog只输出X = [49, 50, 51]49,50和51相应的ASCII值1,2和3.
但是,name/2如果我在一个术语中组合数字和字母,则谓词不起作用.例如,我期望name(2a,X)返回X = [49, 97]和name(3b,X)返回X = [50,98].但是,解释器会给出错误异常,说明操作符是预期的.
我注意到只有术语以数字开头才会出现问题.我检查了按预期name(a2,X)返回的解释器X = [97, 49].
我该如何解决这个问题?或者这种情况本身不能在Prolog中处理?
我本周刚开始学习Prolog,所以我不确定Prolog中是否可以使用for循环.我在Prolog中有两个列表
stringList([hi,hello],[bye,later],X).
Run Code Online (Sandbox Code Playgroud)
如何创建每个列表包含一个元素的新解决方案列表?
所以输出应该是:
X = [hi,bye]
X = [hi,later]
X = [hello,bye]
X = [hello,later]
Run Code Online (Sandbox Code Playgroud) 我想编写为给定 N 生成斐波那契数列的谓词。
fibon(6, X) -> X = [0,1,1,2,3,5].
Run Code Online (Sandbox Code Playgroud)
我有一个谓词来生成斐波那契数列的第 N 个元素:
fib(0, 0).
fib(1, 1).
fib(N, F) :-
N > 1,
N1 is N - 1,
N2 is N - 2,
fib(N1, F1),
fib(N2, F2),
F is F1 + F2.
Run Code Online (Sandbox Code Playgroud)
我尝试编写 fibon/2,但它不起作用:
fibon(N, [H|T]) :-
fib(N, H),
N1 is N - 1,
fibon(N1, T).
Run Code Online (Sandbox Code Playgroud)
我像下面这样解决了它:
at_the_end(X, [], [X]).
at_the_end(X, [H|T], [H|T2]) :-
at_the_end(X, T, T2).
revert([], []).
revert([H|T], Out) :-
revert(T, Out1),
at_the_end(H, Out1, Out).
fib(0, 0).
fib(1, 1). …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个谓词共同(L,S),它从L列表中生成的列表L中列表的所有公共子序列.
subseq([], _).
subseq([H|S], L) :- append(_, [H|T], L), subseq(S, T).
common(L, X) :- not((
member(A, L),
not(subseq(X, A))
)).
Run Code Online (Sandbox Code Playgroud)
即使输入错误,它也只是给我"真实".
例如:
common([[1,2,3,4], [2,3], [12]], X).
true
编辑
我注意到它实际上正在工作,但它不是用谓词为真的术语替换X.
我一直在尝试 Scapy,但文档太稀疏,我无法让它很好地进行简单编辑。
本质上,我正在Python中寻找一个简单的解决方案,从.pcap中获取每个数据包,读取/修改一些数据/删除数据包并将其另存为.pcap。
例如:
给定一个 sACN 数据包,我需要读取/修改优先级八位字节(108)和全域八位字节(113-114)并再次保存。
谢谢!
我在下面列出了代码。如果我定义ARR_SIZE太多(例如 820),则会出现分段错误错误。但是如果ARR_SIZE不是那么大(例如 320),代码就可以工作。
GDB仅在int main().
我认为问题出在二维数组的初始化阶段,但不确定。
#include "stdio.h"
#include "time.h"
#include "stdint.h"
#define ARR_SIZE 820
#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)
void copyji(int src[ARR_SIZE][ARR_SIZE], int dst[ARR_SIZE][ARR_SIZE]){
int i, j;
for (j = 0; j < ARR_SIZE; j++)
for (i = 0; i < ARR_SIZE; i++)
dst[i][j] = src[i][j];
}
void copyij(int src[ARR_SIZE][ARR_SIZE], int dst[ARR_SIZE][ARR_SIZE]){
int i, j;
for (i …Run Code Online (Sandbox Code Playgroud)