需要在SWI-prolog

时间:2017-03-06 18:40:12

标签: prolog

我正在尝试我的手。

我想做以下操作:

假设我有list = [7/5,6/4,5/4,6/3]

我想把它分成两个列表:

列表1将包含[7,6,5,6] 列表2将包含[5,4,4,3]

你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

我找不到图书馆(lambda)所以我不知道它是如何工作的---这个图书馆在哪里?为什么不说你使用哪种Prolog实现?这可能更容易帮助吗?

使用教科书Prolog可以做到这一点:

split_fractions([], [], []).
split_fractions([X/Y|XYs], [X|Xs], [Y|Ys]) :-
    split_fractions(XYs, Xs, Ys).

这只是说如果列表为空,则两个列表为空;如果列表中有X/Y,则其他列表的头部为XY,其余列表也相同。

或者您可以像{lurker所说的那样使用maplist

split_fractions(XYs, Xs, Ys) :-
    maplist(frac_num_den, XYs, Xs, Ys).

frac_num_den(X/Y, X, Y).

如果您在此链接中找到library(lambda):

http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl

您可以保存此文件,然后如果您在swipl所在的目录中启动lambda.pl,则可以写下:

?- use_module(lambda).
true.

%%                                !!!
?- XYs = [a/1, b/2, c/3], maplist(\ (X/Y)^X^Y^true, XYs, Xs, Ys).
XYs = [a/1, b/2, c/3],
Xs = [a, b, c],
Ys = [1, 2, 3].

我还没有阅读文档,但似乎是我标记的空白区域!很重要。

从这里开始:

http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord.html

似乎"文档"在该链接和lambda.pl文件中。我找不到快速解释为什么空白必须在那里。

因为我不想让任何人离开,这里是我发现的另一个用于SWI的lambda库,这个可以直接使用:

?- use_module(library(yall)).
true.

?- maplist([X/Y, X, Y]>>true, [a/1, b/2, c/3], Xs, Ys).
Xs = [a, b, c],
Ys = [1, 2, 3].

但也许没有lambda会更好。

答案 1 :(得分:-1)

[user]
.

%%  `my:exampl` --  "base case" %%

my:exampl([],[],[])
:-
(
    true
)
.

%%  `my:exampl` --  "recursiv case" %%

my:exampl(__p__,__pq__,__q__)
:-
(
    [__p_a__|__p_z__]           =   __p__   ,
    [__p_a__/__q_a__|__pq_z__]  =   __pq__  ,
    [__q_a__|__q_z__]           =   __q__   ,

    my:exampl(__p_z__,__pq_z__,__q_z__) %
)
.

end_of_file
.


/* ..   showing tht it works in the typical usage   :   */

?- 
|    my:exampl(__p__,[7/5,6/4,5/4,6/3],__q__) 
|    .
__p__ = [7, 6, 5, 6],
__q__ = [5, 4, 4, 3] ;
false.



/* ..   showing tht it works in the REVERSE direction of the typical usage  :   */

?- 
|    my:exampl([7, 6, 5, 6],__pq__,[5, 4, 4, 3])
|    .
__pq__ = [7/5, 6/4, 5/4, 6/3] ;
false.

/* ..   showing tht it is STEADFAST in the typical usage    :   */

?-
my:exampl(__p__,__pq__,__q__) , __pq__ = [7/5,6/4,5/4,6/3]
.
__p__  = [7, 6, 5, 6],
__pq__ = [7/5, 6/4, 5/4, 6/3],
__q__  = [5, 4, 4, 3] ;
ERROR: Out of global stack

/* ..   showing tht it FAILS in the typical usage   :   */

?- 
|    my:exampl([7, 6/*, 5, 6*/],__pq__,[5, 4, 4, 3])
|    .
false.

/* ..   showing tht it provides meaningful answers for the most GENERAL usage   :   */

?-
my:exampl(__p__,__pq__,__r__)
.
__p__ = __pq__, __pq__ = __r__, __r__ = [] ;
__p__ = [_1894],
__pq__ = [_1894/_1908],
__r__ = [_1908] ;
__p__ = [_1894, _1918],
__pq__ = [_1894/_1908, _1918/_1932],
__r__ = [_1908, _1932] ;
__p__ = [_1894, _1918, _1942],
__pq__ = [_1894/_1908, _1918/_1932, _1942/_1956],
__r__ = [_1908, _1932, _1956] ;
__p__ = [_1894, _1918, _1942, _1966],
__pq__ = [_1894/_1908, _1918/_1932, _1942/_1956, _1966/_1980],
__r__ = [_1908, _1932, _1956, _1980] 
Action (h for help) ? abort

% Execution Aborted

/* .. APPENDIX : A solution with maplist does not succeed the 2nd test : */

[user]
.

my:example:maplist(Numerators, Fractions, Denominators)
:-
maplist(frac_num_den, Fractions, Numerators, Denominators)
.

frac_num_den(X/Y, X, Y).

end_of_file .


/* .. testing : */

?- 
|    my:exampl([7, 6, 5, 6],__pq__,[5, 4, 4, 3])
|    .
__pq__ = [7/5, 6/4, 5/4, 6/3] ;
false.

?- 
|    my:exampl:maplist(__p__,[7/5,6/4,5/4,6/3],__q__)
|    .
ERROR: apply:maplist_/3: Arguments are not sufficiently instantiated