-->

Prolog list not printing all the elements on conso

2019-07-21 00:08发布

问题:

I am using SWI-PROLOG version 6.6.6

I want to print all the attributes of a particular predicate type.

I have a predicate called law with arity 2.

Some of the facts are

law(borrow,'To borrow Money on the credit of the United States').
law(commerce,'To regulate Commerce with foreign Nations, and among the several States, and with the Indian Tribes').
law(unifomity,'To establish an uniform Rule of Naturalization, and uniform Laws on the subject of Bankruptcies throughout the United States').
law(money,'To coin Money, regulate the Value thereof, and of foreign Coin, and fix the Standard of Weights and Measures').
law(punishment,'To provide for the Punishment of counterfeiting the Securities and current Coin of the United States').
law(establishment,'To establish Post Offices and post Roads').
law(exclusiverights,'To promote the Progress of Science and useful Arts, by securing for limited Times to Authors and Inventors the exclusive Right to their respective Writings and Discoveries').
law(court,'To constitute Tribunals inferior to the supreme Court').

etc.

Now I want to access a law by entering its type. Such as,

power(X) :- law(X,Y), display('\nCongress has the power : '),display(Y).
powers(ALL) :- display('\nCongress has the powers : '), law(_,Y), display('\n'), display(Y).

This works perfectly. Now, I also want the user to know what all types of laws are there so that the user can enter it as a query to get the corresponding law. ex power(money).

For this, I made a query to get all these keywords and add them to a list and display the list. But the list that is finally printed is not complete.

powerList(L) :- findall(X,law(X,_), L).

I use this code to get the list. But the output on the console is

L = [borrow, commerce, unifomity, money, punishment, establishment, exclusiverights, court, piracyfelony|...].

But, there are more law types even after piracyfelony and they are not getting printed to the console. How do I get them printed?

回答1:

This is a feature of Prolog's toplevel loops that tries to keep the output short.

To find out how you might change it, ask which Prolog flags your Prolog supports that have a value being a list of at least two elements:

?- current_prolog_flag(F,Options), Options = [_,_|_].
F = debugger_print_options,
Options = [quoted(true), portray(true), max_depth(10), attributes(portray), spacing(next_argument)] ;
F = toplevel_print_options,
Options = [quoted(true), portray(true), max_depth(10), spacing(next_argument)] ;
F = argv,
Options = [swipl, '-f', none] ;
false.

Now modify it accordingly:

?- length(L,10).
L = [_G303, _G306, _G309, _G312, _G315, _G318, _G321, _G324, _G327|...].

?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]).
true.

?- length(L,10).
L = [_G303, _G306, _G309, _G312, _G315, _G318, _G321, _G324, _G327, _G330].

(In newer versions starting with SWI 7 there is another flag value, answer_write_options.)