prolog , Avoid recursion in predicate


Avoid recursion in predicate

Question:

Tag: prolog

I have the following question for the following predicate, how can i drop the recursive call f(T,S1) from both predicates.

Flow model: (i,o)

f([],0).
f([H|T],S):-
    f(T,S1),
    S1 > 2,!,
    S is S1 + H.
f([_|T],S):-
    f(T,S1),
    S is S1 + 1.

This is a trick question, and I am not that good with prolog. the second predicate fails always.= > can be droped, but what about the second. As I see this method is a list elements counter. Thanks.

Is that even possible?


Answer:

OK, this is a complex issue. You assume it is a trick question, but is it really one? How can we be sure? I will let library(clpfd) do the thinking for me. First I will rewrite your program:

:- use_module(library(clpfd)).

fx([],0).
fx([H|T],S):-
    fx(T,S1),
    S1 #> 2,
    S #= S1 + H.
fx([_|T],S):-
    fx(T,S1),
    S1 #=< 2,
    S #= S1 + 1.

(And just a remark: putting these tests after the recursion twice will make this program require exponentially many inferences, but let's stick to it...)

So I would like to reason about that program in the most general manner. Therefore, I will not take concrete values and then try to figure out a theory. Instead I will ask very general questions (using SICStus):

| ?- assert(clpfd:full_answer).
yes
| ?- length(L,N), fx(L,S).
   L = [],
   N = 0,
   S = 0 ?
;
   L = [_A],
   N = 1,
   S = 1 ?
;
   L = [_A,_B],
   N = 2,
   S = 2 ?
;
   L = [_A,_B,_C],
   N = 3,
   S = 3 ?
;
   L = [_A,_B,_C,_D],
   N = 4,
   _A+3#=S,
   _A in inf..sup,
   S in inf..sup ?
;
   L = [_A,_B,_C,_D,_E],
   N = 5, ...

So please look at the answers N = 0 up to N = 3: There no constraints are involved, effectively all the elements of the list [_A,_B,...] are ignored. However, starting with N = 4 the first element _A now influences the "sum" S since the equation S #= _A+3 holds! With larger values things become more and more complex.

In any case, I cannot see how this could be a trick question. The last three elements are ignored. Well, that's kind of a trick. But otherwise elements (or at least some of them) influence the outcome!


Related:


Predicate that pick elements which are on list twice not less not more


prolog
I'm trying to write a predicate twice(El,L) which will return true. when El is on list exactly twice. Here is what I have: twice(El,L) :- select(El,L,L1), member(El,L1), \+ twice(El,L1). It works nice for twice(2,[1,2,2,3,4]) but for twice(X,[1,1,2,2,3,3]) it doubles every number X = 1 ; X = 1 ; X...

How does pruning choice points in the code below make it more efficient (Prolog)?


prolog,prolog-cut
In the code given below, there is the ! (cut) that prunes the choice point for efficiency. I am pretty certain that the reverse predicate and the agent_do_moves predicate are essential. solve_task(Task,Cost):- agent_current_position(oscar,P), solve_task_a(Task,[b(0,0,P)],[],R,Cost,_NewPos),!, % prune choice point for efficiency reverse(R,[_Init|Path]), agent_do_moves(oscar,Path). ...

PROLOG: Summing up the series procedure


prolog
I have been trying to work on this problem that I found in a book, but am not able to make sense of it in my head. The problem asks me to use series(N, Total) for this procedure; 1 + 1/2 + 1/3 + 1/4 + ... + 1/(N-1). Any...

ANSI escape characters in gprolog


prolog,escaping,iso-prolog
Trying to print bold and underlined text in prolog but can't write them write('\033[1mbold\033[0m') Makes this (expected) error: syntax error: \ expected in \constant\ sequence What's the correct way to do it with gprolog ? Maybe with format ?...

How can I call a function random inside other function in prolog?


prolog,prolog-assert
I'm trying to call the random function inside another function. For example I want to do this assert(fact(random()). But it does not work. How can I insert a random number this way? Thanks.

Prolog- singleton variable in branch warning


variables,prolog,singleton
Hello here is my code in Prolog: arc(a,h). arc(b,c). related_to(X, Ys) :- setof(Y, arc(X, Y), Ys). cut([H|T],Y) :- check(H,Y), T = [] -> cut(T,Y). check(X,Y) :- related_to(X,Xs), member(Y,Xs) -> write('There is a road'); cut(Xs,Y). When I am trying to run check(a,b) it doesn't run. I get the message Singleton variable...

Prolog: append is failing inside loop


prolog
I have the following Prolog code: my_function(A):- my_function(A,[],1). my_function(A,List,Num):- Num_new is Num+1, generateL(O,S,L), write(L),nl, %append(L,List,List_New), ( Num_new < 20 -> my_function(A,List_New,Num_new) ). Which is working. It loops through 19 times, calls generateL which generates a new term L which I print to the screen. I now want on each iteration...

Get operator operands


list,prolog,operators
I have list: List = [a=3, b=2, c=0]. For example, first element a=3, how can I get value Left = a, Right = 3. Left side is atom and right side is number....

make all elements in list equal with minimal cost


list,optimization,prolog
I am trying to create a prolog program that allows to convert a list into a list with the same length consisting of only 1 element from the original list. This element must be chosen in such a way that a minimal number of elements from the original list needs...

prolog misunderstanding. Split list into two list with even and odd positions. where is my mistake?


list,split,prolog
I'm trying to split a list into two other list. List Even with the elemnts in even possition and a List Odd with the others. I've been looking over iinternet a solution, but all seem to me like chinese, i can not understand the process. So this is what i've...

What is the difference between _ and _variable in prolog?


syntax,prolog
I have encountered a lot of problems with a literal that starts with a _ such as _Peter. So what exactly would be the difference between: good(_,_). and good(_,_Peter). Thank you for answering my question!...

Backwards Chaining With Variables


prolog,logic,datalog
I have been reading up about inference in Prolog/Datalog and while forward chaining seems fairly simple to grasp, I have some issues with backward chaining with any sort of complex example which isn't simply propositional or used to determine a true or false value. I was reading an article the...

How to add a print command to DCG syntax


prolog,dcg
I want to add a print command to my DCG syntax, here is what I have: program( (R0 --> R) ) --> [begin],instructs(( R0 --> R )),[end]. instructs( ( R0 --> R ) ) --> instr(( R0 --> R )). instructs( ( R0 --> R ) ) --> instr(( R0...

prolog rules as arguments


prolog,artificial-intelligence,expert-system
I'm building an expert system shell based on Luger & Stubblefield's ExShell. In their system, they define rules in the following way: rule((Goal :- (Premise)), CF_Rule). Ignore the CF_Rule. An example of this syntax is: rule((fix(Advice) :- (bad_component(X),fix(X, Advice))), 100). I want to add an OR in certain rules, but...

Prolog- Returning elements from facts


prolog,return,element,fact
i encounter a problem with facts. Let's say i got 3 facts and check(X) question. fact(a,b). fact(b,c). fact(a,d). check(X):- //some calculation with fact() How to make above question to return list of elements for given X from all facts? For instance: check(a) would give result b and d. So i...

Solving ship puzzle using prolog


prolog,zebra-puzzle
I need to solve the following problem using prolog. These are the facts provided. 1. The Greek ship leaves at six and carries coffee. 2. The Ship in the middle has a black chimney. 3. The English ship leaves at nine. 4. The French ship with blue chimney is to...

What does `\+` signify as an operator in prolog?


syntax,prolog
I have encountered the symbol \+ in prolog and am not sure as to what it signifies. I have gone through the prolog documentation and am either not being too resourceful or have not really noticed it. Thank you for your answer! ...

Constraint not propagated upon instantiation of list members


parsing,prolog,clpfd
I am building a parser and generator for dates and times. In an ordinary programming language these would be written separately. In Prolog+CLP(FD) I can write 1 predicate that does both :-) In my use case it often makes sense to parse a number of digits and convert the to...

Unification with STO detection


algorithm,prolog,unification,iso-prolog
In ISO Prolog unification is defined only for those cases that are NSTO (not subject to occurs-check). The idea behind is to cover those cases of unifications that are mostly used in programs and that are actually supported by all Prolog systems. More specifically, ISO/IEC 13211-1:1995 reads: 7.3.3 Subject to...

How does the predicate 'repeat' create infinite choice points in prolog?


prolog
I do not understand how the predicate repeat evaluates to be true at all times and create infinite choice points. For example, when I call: :- repeat, reset, do(task,job). Thank you for your help! ...

swi-prolog: remove '|:' before user input in compiled program


prolog,swi-prolog
Whenever I compile anything with swi-prolog, it adds |: before user input to show that you are supposed to write something, which would be fine, but I need to pipe the output of this program to another program, preferably without the |:. My compilation options are: swipl -nodebug -g true...

Google api oauth prolog


oauth,google-api,prolog,swi-prolog
I am trying to connect to google oauth. I have used javascript to make a connection to google and get a code, I then understand I need to exchange this code for a token as detailed here: https://developers.google.com/identity/protocols/OAuth2WebServer The code I have is : :- use_module(library(http/http_dispatch)). :- use_module(library(http/http_error)). :- use_module(library(http/html_write))....

Prolog rules and query


prolog
I need some help to find the rules and/or query for knowledgebase in Prolog with information about Costumers in a supermarket. For example I have: Customer(Name,Age,Sex,Wage). customer(John,30,M,2000). customer(Mary,35,F,2500). customer(Mark,40,M,2500). invoice(Number, CostumerName, Product, Price). invoice(001, John, Potatoes, 20). invoice(002, John, Tomatoes, 10). invoice(003, Mary, Soap, 50). invoice(004, Mark, Potatoes, 20). invoice(005,...

prolog traverse nonstandard tree left to right


tree,prolog,tree-traversal
I need to implement a predicate trav(Tree,List) that performs a left to right tree traversal; Where: Tree is defined by the structure node(left,right), where left and right can be either another node or any Prolog data item. List is the list of leaf node values in the tree. For example:...

List Read and Pass it to Right Clause Functor In Prolog


prolog
This is my code: functor1(Action,[Action|_]) :- functor2(container(Action)). functor1(Action,[_|OtherActions]) :- functor1(Action,OtherActions). functor2(container([Abc,Def])):- append([Abc],[Def],Z),write(Z). Now, when I try to query, functor1(X,[[first, sign],[second, sign]]). What I expect with this query is that firstly X should read X = [first,sign] and then pass to functor2's container so that my functor2 can come into play....

How to get Prolog to explain your result beyond the true statement


prolog
I have the following facts and rules: flight(sea,msp). flight(msp,jfk). route(A,B) :- flight(A,B). route(B,A) :- flight(A,B). route(A,C) :- flight(A,B) , flight(B,C). when query for route(sea,jfk) I get a result true but what I wish to get is the explination: sea-->msp-->jfk this way I can tell not only that it's true but...

Why I can't get an answer for the Ship Puzzle with Prolog?


prolog,zebra-puzzle
I need to solve the Ship Puzzle problem with using Prolog. Here are the facts. There are 5 ships. 1. The Greek ship leaves at six and carries coffee. 2. The Ship in the middle has a black chimney. 3. The English ship leaves at nine. 4. The French ship...

Prolog-iterating through list


list,prolog,iteration,head
Let's say i have list Xs = [a,b,c]. Now i want to iterate through all elements and call another function for this elements. My question is: how to do this using head and tail? I would be grateful for help.

Prolog returning true/false instead of variable


prolog
I'm working on the very easy reverse list example in Prolog. append(A, [], [A]). append(A, B, [A|B]). reverse([], ReversedList). reverse([A,B], ReversedList) :- reverse(B, TemporaryList), append(A, TemporaryList, ReversedList). append works correctly. However, when I call reverse the interpreter doesn't respond with a variable like append but instead it just write true...

Split list in prolog, produce two separate lists


list,prolog
The Question: Define a predicate split/4 which, when provided with a list L and integer N returns two lists, A and B, where A contains the items in L that are greater than or equal to N and B contains the items that are lower than N. Sample query with...

SWI Prolog pass a goal with non-zero arity through the command line arguments


bash,prolog,swi-prolog,logic-programming
SWI Prolog allows the execution of a goal before top level with non zero arity as follows swipl -s consultingfile.pl -g start however when a predicate with non zero arity is specified as follows swipl -s consultingfile.pl -g start(1) It gives an error syntax error near unexpected token '(' What...

Translating a list to another list in prolog


prolog
I Tried to write a simple code in Prolog which translate a list to another list. for instance, if we call listtrans([a,b,c],L), L will become [1,2,3]. (a,b,c is replaced with 1,2,3). But i faced with a syntax error in last line. what is the problem? here is my code: trans(a,1)....

How to keep punctuation as a separate element in split_string in Prolog


string,split,prolog,swi-prolog,punctuation
I'm doing an assignment in Prolog (I'm a newbie) and I have a small problem. I know you can split a string to a list of elements in Prolog like this: split_string("Hello, here I am!"," "," .!?-_'",Temp). But this takes out the basic punctuation. It returns: Temp = ['Hello','here','I','am']. How...

Prolog: Obtain 1st element in “list of lists”


prolog
I have a "list of lists" e.g. [[A,B,C],[A,B],[D,F]]. I now wish to print to the screen the first element of the list, (i.e. [A,B,C] in this example). I had thought I could do this as follows: testfunction(List):- List=[[Top]|Rest], write(Top),nl,nl. However, when I run this with testfunction([[A,B,C],[A,B],[D,F]]). it seems to fail...

Freezing goal in prolog


prolog,primes,sieve-of-eratosthenes,prolog-coroutining
I want to freeze my goal until some variable, for example list, is unbounded, right now I have sieve(N,L) :- freeze(Aux,sieve(N,L,[],Aux)), numlist(2,N,Aux). sieve(N,L,R,[H|T]) :- freeze(X, X mod H =\= 0 ; X == H), findall(X,select(X,T,_),P), sieve(N,L,[H|R],P). sieve(_,L,L,[]). But it stop after some operations and waits forever. Could someone tell me...

gprolog: Getting a stacktrace after an exception


prolog,gnu-prolog
While using gprolog I often have exceptions without any kind of line numbers or context like this one: uncaught exception: error(instantiation_error,(is)/2) Without any kind of context. I know I can do a trace but it would take very long to debug it with trace since I need to execute a...

Why was the ISO standard for prolog a failure? [closed]


module,prolog,standards,iso,iso-prolog
In the introduction here, it states that the ISO standard for Prolog was a failure. Can anyone elaborate on this?

Prolog: Summing elements of two lists representing an integer(restrictions inside not regular sum!!)


list,prolog
I was solving a problem: A list is representing an integer say 12345 by L=[12,34,5] each element should be from 0 to 99.The exercise is to write a function (sum) that sums two lists and gives the equivalent list of their sum which is representing the sum of two integers....

accessing program listing in prolog


prolog
I'm having some strange (or not so strange) problems defining variables in SWI-Prolog. Example: I'd like to do something like below: :- initialization(main). main :- X = listing(main), write(X). but it's simply printing "listing(main)" ...

freeze for more than one variable


prolog,prolog-coroutining
I tried to write a predicate that takes a list and converts it to a balanced tree. My code looks as follows: /* make_tree(list, tree) * * list: list with the elements of the tree in prefix order * tree: balanced tree of the elements in the list * */...

How to write number classifiers in prolog?


prolog
Playing with Prolog for the first time and while I thought I knew what it basically is good for, I find it hard to get anything done in it. So, I tried to find the easiest possible task and even fail to accomplish that. I think it is due to...

Wait the end of a predicate Prolog


prolog,wait,predicate
I have a predicate list_moves(Move), that gives all the possible moves for a game. Then I have the following predicates : find_best_move:- nb_setval(best,0), list_moves(NewMove), nb_getval(best,OldMove), better(OldMove,NewMove). better(OldMove, NewMove):- NewMove > OldMove, nb_setval(best,NewMove), !. better(_,_). get_best_move(Move):- find_best_move, nb_getval(max,Move). I want to get only one move when I call get_best_move(Move) : the...

Prolog binding arguments


prolog,meta-predicate
In sicstus prolog, there's a predicate: maplist(:Pred, +List) Pred is supposed to take just one argument - List element. How can I pass a 2-argument predicate, with first argument defined? In other languages it would be written as: maplist(pred.bind(SomeValue), List) ...

Solving constraints with string concatenations in Prolog


prolog,swi-prolog
Here, I tried to solve some simple string constraints in Prolog. While this problem seems to be straightforward, the main predicate still does not print the value of FinalString, which should be "hello world". Is it possible for Prolog to solve constraints that contain string concatenations, like this one? :-...

Unwanted logical variable in Prolog output


prolog
I have to do a Prolog homework for College and I'm mostly done, but i keep getting a _G variable in the output. We need to compare a List - L - to a regular term - K -, and, if the item in the list is bigger than the...

How to find the positive numbers in a list in Prolog?


prolog
I want to write a code in prolog that gets a list and find its positive numbers and adds them into a new list as below : ?- findPositives([-1,2,3,-5,-7,9],Result) Result : [2,3,9] How can I write this code? ...

Avoid recursion in predicate


prolog
I have the following question for the following predicate, how can i drop the recursive call f(T,S1) from both predicates. Flow model: (i,o) f([],0). f([H|T],S):- f(T,S1), S1 > 2,!, S is S1 + H. f([_|T],S):- f(T,S1), S is S1 + 1. This is a trick question, and I am not...

prolog need to compute the tree size


prolog,size,nodes
I need to get the size of a tree using: size(Tree,Size) What I have so far is wrong, please advise! size(empty, Size). size(tree(L, _, R), Size) :- size(L, Left_Size), size(R, Right_Size), Size is Left_Size + Right_Size + 1. Output should produce: ?- size(node(1,2),X). X = 2. ?- size(node(1,[2,3,4]),X). X =...

Prolog isomorphic graphs


graph,prolog,isomorphism
Good night. Trying to solve the isomorphic graphs problem here. Assignment info: Determine whether 2 undirected graphs are isomorphic. No isolated vertices. Number of vertices is less than 30 Edges of graphs are given as predicates, i.e. e(1, 2). f(1, 2). I'm trying to use the following approach: For every...

Syntax Error, Operator Expected


sql-server,prolog
I am trying to query the MS SQL Server database using Prolog. Prolog Code lemmas:- odbc_query('my_db', 'SELECT * ,case when ActualCost<EstimatedCost then 'true' else 'false' end as Value from Work_Order ' ). It gives an error that operator is expected after 'true' . Note: The Query works in SQL-Server but...