gpt4 book ai didi

Prolog:将数字附加到术语上

转载 作者:行者123 更新时间:2023-12-02 04:22:46 25 4
gpt4 key购买 nike

是否可以直接在术语后附加数字?

也就是说,我可以轻松地做这样的事情:

?- A = 1 + 2, B = 3, C = A + B.
C = 1+2+3

但是有没有办法(运算符?)在 C = A + B 中指定一些内容而不是“+”来获得“C = 1+23”?

我觉得我在要求一些奇怪的东西,所以这里是上下文。我有一个数字列表,我想生成可以通过在数字之间放置“+”、“-”或获得的所有表达式。

优点和缺点都很简单:

possible([X], X) :- !.
possible([A, B | Rest], E) :-
( H = A + B ; H = A - B ),
possible([H | Rest], E).

?- possible([1, 2, 3], E).
E = 1+2+3 ?;
E = 1+2-3 ?;
E = 1-2+3 ?;
E = 1-2-3
yes

但我也想得到“E = 12+3”、“E = 1+23”和“E = 123”。有简单的方法吗?

更新:解决方案应该是可移植的或者至少可以在 B-Prolog 中工作。

最佳答案

这是我的赌注

possible([N|Ns], D) :-
digits_number([N|Ns], D).
possible([N|Ns], X) :-
append([L|Ls], [R|Rs], [N|Ns]),
possible([L|Ls], Lx),
digits_number([R|Rs], Rx),
(Op = + ; Op = -), X =.. [Op, Lx, Rx].

digits_number(Digits, N) :-
maplist(digit_code, Digits, Codes),
number_codes(N, Codes).
digit_code(D, C) :-
C is D + 0'0.

详细的 [N|Ns] 等的目的是避免匹配空列表。

编辑这是一个变体,不需要maplist/3和number_codes/2。代码的大小非常相似......

possible(Ns, D) :-
digits_number(Ns, _, D).
possible([N|Ns], X) :-
append([L|Ls], [R|Rs], [N|Ns]),
possible([L|Ls], Lx),
digits_number([R|Rs], _, Rx),
(Op = + ; Op = -), X =.. [Op, Lx,Rx].

digits_number([Digit], 1, Digit).
digits_number([D|Ds], F, N) :-
digits_number(Ds, G, T),
F is G * 10,
N is T + D * F.

它更高效(至少在推理计数上),实际上这是一个性能测试

?- L=[1,2,3,4,5,6,7,8], time(findall(X,possible_1(L,X),L1)), time(findall(X,possible_2(L,X),L2)).
% 31,591 inferences, 0.017 CPU in 0.017 seconds (100% CPU, 1851600 Lips)
% 20,656 inferences, 0.017 CPU in 0.018 seconds (98% CPU, 1192235 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8],
L1 = L2, L2 = [12345678, 1+2345678, 1-2345678, 12+345678, 12-345678, 1+2+345678, 1+2-345678, ... - ... + 345678, ... - ...|...].

当然,我已经将这两个版本重命名为possible_1、possible_2

关于Prolog:将数字附加到术语上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com