相关疑难解决方法(0)

更紧凑的定义

鉴于word/1,

word(W) :-
   abs(ABs),
   ABs = W.

abs([]).
abs([AB|ABs]) :-
   abs(ABs),
   ab(AB).

ab(a).
ab(b).

?- word(W).
   W = []
;  W = [a]
;  W = [b]
;  W = [a,a]
;  W = [b,a]
;  W = [a,b]
;  W = [b,b]
;  W = [a,a,a]
;  W = [b,a,a]
;  W = [a,b,a]
;  W = [b,b,a]
;  W = [a,a,b]
;  W = [b,a,b]
;  W = [a,b,b]
;  W = [b,b,b]
;  W = …
Run Code Online (Sandbox Code Playgroud)

prolog

24
推荐指数
4
解决办法
1065
查看次数

AUBUC的Prolog联盟

我最近开始学习Prolog,我无法解决如何组合三个列表的问题.

我能够组合2个列表:

%element
element(X,[X|_]).
element(X,[_|Y]):-
               element(X,Y).

%union

union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

list prolog

20
推荐指数
2
解决办法
2605
查看次数

PROLOG:如果顺序无关紧要,确定列表中的元素是否相等

我试图找出一种方法来检查两个列表是否相等,无论它们的元素顺序如何.

我的第一次尝试是:

areq([],[]).
areq([],[_|_]).
areq([H1|T1], L):- member(H1, L), areq(T1, L).
Run Code Online (Sandbox Code Playgroud)

但是,这只检查左侧列表中的所有元素是否都存在于右侧列表中; 意思areq([1,2,3],[1,2,3,4]) => true.在这一点上,我需要找到一种能够以双向意义测试事物的方法.我的第二次尝试如下:

areq([],[]).
areq([],[_|_]).
areq([H1|T1], L):- member(H1, L), areq(T1, L), append([H1], T1, U), areq(U, L).
Run Code Online (Sandbox Code Playgroud)

在哪里我会尝试重建左边的那个以及最后的交换列表; 但这次失败了.

我对递归的感觉非常差,根本不知道如何改进它,尤其是Prolog.任何提示或建议都将在此时受到赞赏.

prolog

13
推荐指数
4
解决办法
3721
查看次数

如何在 Prolog 中为“十只猫中有八只倒计时”数字游戏解算器生成不同的解决方案?

我编写了一个 Prolog 程序来查找任何“十分之八的猫会倒计时”数字序列的所有解决方案。我对结果很满意。然而,解决方案并不是唯一的。我尝试从“解决方案序列”库distincts()中获取。他们没有提出独特的解决方案。reduced()

\n\n

问题\xc2\xa0很简单。您有一个给定的六个数字列表 [n1,n2,n3,n4,n5,n6] 和一个目标数字 (R)。仅使用 \xc2\xa0+,-,*,/ 从 n1 到 n6 的任意 \xc2\xa0 组合计算 R。您不必使用所有号码,但每个号码只能使用一次。如果两个解相同,则只能生成一个,而丢弃另一个。\xc2\xa0

\n\n

有时,不同的\xc2\xa0排列会产生等效的\xc2\xa0结果。例如:

\n\n
(100+3)*6*75/50+25\n(100+3)*75*6/50+25\xc2\xa0\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有人有任何建议来消除这种冗余?

\n\n

每个解决方案都是嵌套的运算符和整数。例如+(2,*(4,-(10,5)))。该解决方案是一个不平衡二叉树,根节点和同级节点使用算术运算符,叶节点使用数字。为了获得唯一的解决方案,任何两棵树都不应该是等价的。

\n\n

代码:

\n\n
:- use_module(library(lists)).\n:- use_module(library(solution_sequences)).\n\nsolve(L,R,OP) :-\n    findnsols(10,OP,solve_(L,R,OP),S),\n    print_solutions(S).\n\nsolve_(L,R,OP) :-\n    distinct(find_op(L,OP)),\n    R =:= OP.\n\nfind_op(L,OP) :-\n    select(N1,L,Ln),\n    select(N2,Ln,[]),\n    N1 > N2,\n    member(OP,[+(N1,N2), -(N1,N2), *(N1,N2), /(N1,N2), N1, N2]).\nfind_op(L,OP) :-\n    select(N,L,Ln),\n    find_op(Ln,OP_),\n    OP_ > N,\n    member(OP,[+(OP_,N), -(OP_,N), *(OP_,N), /(OP_,N), OP_]).\n\nprint_solutions([]).\nprint_solutions([A|B]) :-\n  format(\'~w~n\',A),\n  print_solutions(B).\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试:

\n\n
solve([25,50,75,100,6,3],952,X)\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n …

search prolog dcg

5
推荐指数
1
解决办法
386
查看次数

标签 统计

prolog ×4

dcg ×1

list ×1

search ×1