Prolog的DCG给我留下了深刻的印象,我能够多快地生成适合特定语法的所有可能结构.
但我想将此搜索与其他约束结合起来.例如,定义一个复杂的语法,并要求Prolog生成不超过10个单词的所有句子.或者所有不重复相同单词两次的句子.
是否可以向DCG语法添加这样的额外约束?或者我基本上必须将DCG转换回正常的Prolog条款并开始修改它们?
我编写了一个 Prolog 程序来查找任何“十分之八的猫会倒计时”数字序列的所有解决方案。我对结果很满意。然而,解决方案并不是唯一的。我尝试从“解决方案序列”库distincts()中获取。他们没有提出独特的解决方案。reduced()
问题\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有没有人有任何建议来消除这种冗余?
\n\n每个解决方案都是嵌套的运算符和整数。例如+(2,*(4,-(10,5)))。该解决方案是一个不平衡二叉树,根节点和同级节点使用算术运算符,叶节点使用数字。为了获得唯一的解决方案,任何两棵树都不应该是等价的。
代码:
\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测试:
\n\nsolve([25,50,75,100,6,3],952,X)\n结果
\n\n …我无法弄清楚这出错的地方.请注意,我对Prolog很新,我确定我错过了一些东西 - 不知道那可能是什么.有人可以帮帮我吗?
谢谢,这是我的代码:
printSentence([]).   
printSentence([W|[]]) :-
    write(W),
    write('.'),
    nl.  
printSentence([W|R]) :-
    write(W),
    write(' '),
    printSentence(R).
transform([], Result).  
transform([Word|Rest], Result) :-
    replace(Word, Replacement),
    append(Result, Replacement, NewResult),
    transform(Rest, NewResult).
replace(my, your).
replace(i, you).
replace(you, me).
replace(am, are).
replace(Word, Word).
test :-
    X = [you, are, my, only, hope],
    transform(X, Result),
    printSentence(Result).