【问题标题】:creating a shallow binary predicate in Prolog to replace all the number in a list by atom 'number'在 Prolog 中创建一个浅二元谓词以用原子“数字”替换列表中的所有数字
【发布时间】:2015-10-12 15:33:40
【问题描述】:

我正在尝试创建一个深度二元谓词text/2,它将处理一个列表并用原子number 替换列表中的每个数字。

例子:

 ?- text([a,[[13]],b,14,c(5),8], Xs).
 Xs = [a,[[number]],b,number,c(5),number].

解决方案:

我尝试如下做,但得到了

警告:尝试在 SGETTOK 中读取文件末尾

代码是:

toNumber(In,number) :-
   number(In),
   !.
toNumber(In,In).

maplist(_,[],[]).
maplist(Pred,[InListHead|InListTail],[OutListHead|OutListTail]) :-
   Term = [Pred,InListHead,OutListHead],
   call(Term),
   maplist(Pred,InListHead,OutListHEad).

text(InListHead,OutListHead) :-
   maplist(toNumber,InListHead,OutListHead).

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    您可以使用以下内容:

    text(List,New):-
      maplist(item_replace,List,New).
    
    item_replace(Item,number):-
      number(Item).
    item_replace(Item,Item).
    

    问:

    ?- text([a,[[13]],b,14,c(5),8], Xs).
    Xs = [a, [[13]], b, number, c(5), number] .
    

    这将回溯到您可能不想要的其他答案。所以你可以添加一个剪辑。

    item_replace(Item,number):-
      number(Item),!.
    item_replace(Item,Item).
    

    item_replace(Item,number):-
      number(Item).
    item_replace(Item,Item):-
      \+number(Item).
    

    另一种尝试使用一些逻辑纯度谓词的方法..

    is_number(L,T):-
      number(L)->
      T =true;T=false.
    
    item_replace(Item,Number):-
      if_(is_number(Item),Number=number,Number=Item).
    
    text_2(List,New):-
      maplist(item_replace,List,New).
    

    问:

    ?-text([a,[[13]],b,14,c(5),8], Xs).
    Xs = [a, [[13]], b, number, c(5), number].
    

    【讨论】:

    • 您使用 cut ((!)/0) 的部分并不坚定。再看看你的这段代码sn-p:item_replace(Item,number) :- number(Item), !. item_replace(Item,Item). 然后比较下面的查询,它们的逻辑语义,和实际的查询结果:`?- item_replace(1,number).`?- item_replace(X,number).?- item_replace(1,1).
    • 第二个定义考虑?- item_replace(X,Y).。它给出了单一的答案X = Y。这对我来说看起来不对。
    • 尽可能紧密地包含元逻辑谓词的效果是一件好事!将(!)/0 拖出,然后将其放在text/2 的规则正文中 maplist/3 目标 之后会变得非常糟糕......我感觉自己在进步,坚持下去,你会走得更远。
    • flatten/2 不好。在逻辑纯代码中安全地使用它几乎是不可能的。但是……,你为什么还要flatten? OP 给出了一个带有预期结果的示例查询,其中明确指出 OP 确实 想要深度遍历任意 Prolog 化合物,而只想要浅层遍历列表:meta-predicate @ 完全涵盖了这一点987654339@。那么……为什么要扁平化?
    • 现在,item_replace/2 的所有四个实现在参数没有充分实例化时都会失去逻辑可靠性。为什么不使用异常/协同程序来保留声明性语义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多