我在这个问题上停留了两个小时!我在序言中的问题是我正在以声明的方式思考!
所以我的问题是使序言生成等于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/

10-13 02:14