我在这个问题上停留了两个小时!我在序言中的问题是我正在以声明的方式思考!
所以我的问题是使序言生成等于N的列表!列表的大小为5。
somme([],0) :- !.
somme([X|L],S) :- somme(L,S1), S is S1+X.
generateList(L,RES) :- C1 is random(4)+1,
C2 is random(5)+1,
C3 is random(6)+1,
append(L,[C1,C2,C3],RES).
go(L) :- generateList([2,3],L), somme(L,S), S \==16, go(L).
go(L) :- generateList([2,3],L), somme(L,S), S == 16,write(L).
我们假设第一个2个元素是2和3。
最佳答案
您的程序,已修改:
somme([],0). /* the cut is useless, since [] and [X|L] are distinguished */
somme([X|L],S) :- somme(L,S1), S is S1+X.
generateList(L,RES) :- C1 is random(4)+1,
C2 is random(5)+1,
C3 is random(6)+1,
append(L,[C1,C2,C3],RES).
/* A variable can be assigned only once, then you must backtrack. */
/* So: repeat/0 introduces a backtrack point, going into a "failure driven loop" */
/* until the test succeeds */
go(L) :- repeat, generateList([2,3],L), somme(L,S), S == 16, !.
测试运行
?- go(L).
L = [2, 3, 2, 4, 5].
?- go(L).
L = [2, 3, 2, 3, 6].
关于prolog - 列表总数必须为16,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44962136/