4

用語に数値を直接追加することは可能ですか?

つまり、次のようなことを簡単に行うことができます。

?- 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 で動作する必要があります。

4

5 に答える 5

2

このシンプルで完全に移植可能なソリューションはどうですか:

possible([Digit], Digit).
possible([Digit| Digits], Digit + RightExpression) :-
    possible(Digits, RightExpression).
possible([Digit| Digits], Digit - RightExpression) :-
    possible(Digits, RightExpression).
possible([Digit1, Digit2| Digits], Expression) :-
    Number0 is Digit1 * 10,
    Number is Number0 + Digit2,
    possible([Number| Digits], Expression).

テストに B-Prolog を使用する:

$ bp
B-Prolog Version 8.1, All rights reserved, (C) Afany Software 1994-2014.
| ?- [possible].
consulting::possible.pl

yes
| ?- possible([1,2,3], Exp).
Exp = 1+(2+3) ?;
Exp = 1+(2-3) ?;
Exp = 1+23 ?;
Exp = 1-(2+3) ?;
Exp = 1-(2-3) ?;
Exp = 1-23 ?;
Exp = 12+3 ?;
Exp = 12-3 ?;
Exp = 123 ?;
no

パフォーマンスに関しては、カルロの回答と同じベンチマークを使用すると、次のようになります。

?- L=[1,2,3,4,5,6,7,8], time(findall(X,possible(L,X),L1)).
% 12,037 inferences, 0.003 CPU in 0.003 seconds (93% CPU, 4223509 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8],
L1 = [1+ (2+ (3+ (4+ (5+ (6+ (7+8)))))), 1+ (2+ (3+ (4+ (5+ (6+ (7-8)))))), 1+ (2+ (3+ (4+ (5+ (6+78))))), 1+ (2+ (3+ (4+ (5+ (... - ...))))), 1+ (2+ (3+ (4+ (... + ...)))), 1+ (2+ (3+ (... + ...))), 1+ (2+ (... + ...)), 1+ (... + ...), ... + ...|...].
于 2014-05-08T23:40:14.560 に答える