开发者

creating lists, searching sth which has been given and making combination on prolog

开发者 https://www.devze.com 2023-03-05 19:10 出处:网络
I want to make a Prolog program. Predicate will be like this: name(name, failedCourse, age) Database of the program is:

I want to make a Prolog program. Predicate will be like this:

name(name, failedCourse, age)

Database of the program is:

name(george, math, 20).
name(steve, phys, 21).
name(jane, chem, 22).

I want to implement the predicate nameList(A, B). A means list of names, B means number of names on the list. For example:

nameList([george, steve],2). returns true
nameList([george, steve],X). returns X=2
nameList(X,2). returns X=[george, steve]; X=[george, jane]; X=[steve, jane]
nameList([martin],1). returns false (because martin is not included database.)

I wanted to make a list that includes all names on the database. For that reason I made a findall.

descend(X,Y,A) :- name(X,Y,A).
descend(X,Y,A) :- name(X,Z,A),descend(Z,Y,A).
findall(director(X),descend(Y,X),Z).
?- findall(B,descend(B,X,Y),A). returns A = [george, steve, jane].

But I could not figure it out to use list A in predicates :( I开发者_开发问答 cannot search the list for A in the nameList.

If you help me, I will be very grateful.


The main thing you need is a predicate that calculates combinations of a given length and of a given list:

comb(0, _, []).

comb(N, [X | T], [X | Comb]) :-
    N > 0,
    N1 is N - 1,
    comb(N1, T, Comb).

comb(N, [_ | T], Comb) :-
    N > 0,
    comb(N, T, Comb).

Usage:

?- comb(2, [a, b, a], Comb).
Comb = [a, b] ;
Comb = [a, a] ;
Comb = [b, a] ;
false.

(See more here.)

Now you can just apply this predicate on your data:

name(george, math, 20).
name(steve, phys, 21).
name(jane, chem, 22).    

name_list(L, N) :-
    findall(X, name(X, _, _), Xs),
    length(Xs, Len),
    between(0, Len, N),
    comb(N, Xs, L).

Usage examples:

?- name_list(L, N).
L = [],
N = 0 ;
L = [george],
N = 1 ;
L = [steve],
N = 1 ;
L = [jane],
N = 1 ;
L = [george, steve],
N = 2 ;
L = [george, jane],
N = 2 ;
L = [steve, jane],
N = 2 ;
L = [george, steve, jane],
N = 3 ;
false.

?- name_list([george, steve], N).
N = 2 ;
false.

?- name_list(L, 2).
L = [george, steve] ;
L = [george, jane] ;
L = [steve, jane] ;
false.



name(george, math, 20).
name(steve, phys, 21).
name(jane, chem, 22).

name_list(Name_List,N) :-
        integer(N),
        findall(Name,name(Name,_,_),L),
        combination(L,N,Name_List).
name_list(Name_List,N) :-
        var(N),
        findall(Name,name(Name,_,_),L),
        length(L,Len),
        for(1,N,Len),
        combination(L,N,Name_List).

combination(X,1,[A]) :-
        member(A,X).
combination([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        combination(Y,M,X).
combination([_|Y],N,A) :-
        N > 1,
        combination(Y,N,A).
0

精彩评论

暂无评论...
验证码 换一张
取 消