小编cod*_*der的帖子

Prolog - 计算数字的出现次数

我想写谓词,它可以计算所有遇到的数字:

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)

为什么不工作呢?

prolog

3
推荐指数
1
解决办法
1530
查看次数

如何仅计算列表中的数字元素(PROLOG)

count([],0).
count([_|Tail], N) :- count(Tail, N1), N is N1 + 1.
Run Code Online (Sandbox Code Playgroud)

这计算了所有元素,但我只需要计算数字。

prolog

3
推荐指数
1
解决办法
1万
查看次数

为什么[] = _.在Prolog中是真的吗?

我正在学习Prolog,并且不明白为什么?- [] = _.在SWI-Prolog中返回true. []是一个空列表,_意味着它不是空的,对吧?
有人可以解释上述逻辑吗?

prolog

3
推荐指数
1
解决办法
457
查看次数

试图检查线是在2点之间存在,Prolog

我试图检查行是否实际在规则集中存在的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).是一个真正的线,因为az在设置规则两个点,但line(l,k).并不是真正的线,因为lk没有在规则组真实点.

我是Prolog的新手,并且想要了解如何做到这一点.

point prolog line

3
推荐指数
1
解决办法
95
查看次数

从Prolog中的term获取ASCII值列表

我使用的是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中处理?

ascii prolog

3
推荐指数
1
解决办法
170
查看次数

Prolog:你如何在两个列表之间进行迭代(nest for-loop)?

我本周刚开始学习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)

list prolog

3
推荐指数
1
解决办法
92
查看次数

Prolog - 生成斐波那契数列

我想编写为给定 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)

prolog fibonacci

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

prolog中列表的常见子序列

我正在尝试编写一个谓词共同(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.

prolog

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

需要一种简单的方法来本地修改wireshark .pcap数据包的数据

我一直在尝试 Scapy,但文档太稀疏,我无法让它很好地进行简单编辑。

本质上,我正在Python中寻找一个简单的解决方案,从.pcap中获取每个数据包,读取/修改一些数据/删除数据包并将其另存为.pcap。

例如:

给定一个 sACN 数据包,我需要读取/修改优先级八位字节(108)和全域八位字节(113-114)并再次保存。

谢谢!

python scapy pcap wireshark

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

如果二维数组的大小太大,则会出现分段错误

我在下面列出了代码。如果我定义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)

c segmentation-fault multidimensional-array

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